通过对象类型Java进行引用

通过对象类型Java进行引用,java,Java,在Java中是否可以按对象的类型引用对象 例如,我有: private static class Pet { private String name; public String getName() { return name; } public Pet setName(String name) { this.name = name; return this; } } public static cla

在Java中是否可以按对象的类型引用对象

例如,我有:

private static class Pet {
    private String name;

    public String getName() {
        return name;
    }

    public Pet setName(String name) {
        this.name = name;
        return this;
    }
}

public static class CAT extends Pet{}

public static class DOG extends Pet{}
我把一堆猫和狗的宠物放进一个接受宠物的链表中。我想通过以下方式查找狗的最后索引:

        private Pet dequeueDog() {
        int locationDog = linkedList.lastIndexOf(DOG);
        return linkedList.remove(locationDog);
    }

有可能吗?要按对象类型引用对象?

假设您使用的是Java 8,您可以
筛选出所有非
以查找最后一只狗,然后搜索该狗:

private static Pet dequeueDog(LinkedList<Pet> linkedList) {

    List<Pet> dogList = linkedList.stream().filter(u -> u.getClass() == DOG.class).collect(Collectors.toList());
    int locationDog = linkedList.lastIndexOf(dogList.get(dogList.size()-1));
    return linkedList.remove(locationDog);
}
private静态宠物排队狗(LinkedList LinkedList){
List dogList=linkedList.stream().filter(u->u.getClass()==DOG.class).collect(Collectors.toList());
int locationDog=linkedList.lastIndexOf(dogList.get(dogList.size()-1));
返回linkedList.remove(locationDog);
}

例如,我在列表中输入了两条
s和三条
s,然后接收我放入集合中的第二条
狗。您可以通过更改放入
dogList.get()
中的内容来扩展它,以删除
n
th
DOG
,这在Java中是可能的,但有点难看。这里有一个方法可以做到这一点,给定一个列表和一个要搜索的类型

public static <T> T getLastOfType(List<? super T> list, Class<T> type) {
    Object[] arr = list.toArray();
    for (int i = arr.length - 1; i >= 0; i--) {
        if (arr[i] == null) continue;

        if (type.isAssignableFrom(arr[i].getClass())) {
            return (T) arr[i];
        }
    }
    return null;
}

publicstatict getLastOfType(ListUse
instanceof

package com.example;

import static org.junit.Assert.*;

import java.util.Arrays;
import java.util.List;

import org.junit.Test;

public class ExampleTest {

    class Pet {
    }

    class CAT extends Pet {
    }

    class DOG extends Pet {
    }

    private Pet dequeueDog(List<Pet> linkedList) {
        int i = 0;
        Integer foundIndex = null;
        DOG found = null;
        for (Pet pet : linkedList) {
            if (pet instanceof DOG) {
                foundIndex = i;
                found = (DOG) pet;
            }
        }
        if (foundIndex != null) {
            linkedList.remove(foundIndex);
        }
        return found;
    }

    @Test
    public void test() {
        DOG someDog = new DOG();
        CAT someCat = new CAT();
        assertEquals(someDog, dequeueDog(Arrays.asList(someCat, someDog, null, someDog, someCat)));
    }

}
package.com.example;
导入静态org.junit.Assert.*;
导入java.util.array;
导入java.util.List;
导入org.junit.Test;
公共类示例测试{
等级宠物{
}
宠物猫{
}
宠物狗{
}
私人宠物排队狗(列表链接列表){
int i=0;
整数foundIndex=null;
DOG found=null;
用于(宠物:linkedList){
if(狗的宠物实例){
foundIndex=i;
发现=(狗)宠物;
}
}
if(foundIndex!=null){
linkedList.remove(foundIndex);
}
发现退货;
}
@试验
公开无效测试(){
DOG someDog=新狗();
CAT someCat=新的CAT();
assertEquals(someDog,dequeueDog(Arrays.asList(someCat,someDog,null,someDog,someCat));
}
}

否。您可以向后迭代列表,并测试对象是否为该类型的引用-但是
list
没有内置方法来执行此操作。太棒了。我实际上是想问您是否可以测试对象是否为该类型的引用!将其作为答案,以便我可以标记此问题是否已解决?使用getclass()@lawonga或instanceof。此类容器/访问方法(按类型索引)通常命名为“Context”。请阅读一些theory@ElliottFrisch它不是一个内置的方法,也不是一个单行程序,但肯定有方法不用显式迭代就可以实现。