通过对象类型Java进行引用
在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
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
thDOG
,这在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(ListUseinstanceof
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它不是一个内置的方法,也不是一个单行程序,但肯定有方法不用显式迭代就可以实现。