是否可以通过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{}
我把一堆CATS和DOGS宠物放入一个接受宠物的链接列表中。我想通过以下方式找到DOG的最后一个索引:
private Pet dequeueDog() {
int locationDog = linkedList.lastIndexOf(DOG);
return linkedList.remove(locationDog);
}
有可能这样做吗?要通过对象类型引用对象吗?
答案 0 :(得分:1)
假设您正在使用Java 8,您可以filter
取出所有非DOG
来查找最后一只狗然后搜索它:
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);
}
Here这是一个示例,我将两个DOG
和三个CAT
放入列表中,然后收到我投入的第二个DOG
集合。您可以通过更改n
中的内容来扩展此项以删除DOG
dogList.get()
。
答案 1 :(得分:1)
在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;
}
以下是对它的实际应用的一点测试:http://pastebin.com/yX1v6L9p(请注意,不严格需要显式类型参数。)
这可以通过使用泛型和类方法isAssignableFrom来检查列表中对象的类型与所需类型。
答案 2 :(得分:1)
像这样使用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)));
}
}