[英]Referencing by an object type 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 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);
}
有可能这样做吗? 通过对象类型引用对象是什么?
假设您正在使用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);
}
这是一个例子,我将两个DOG
和三个CAT
放入列表中,并接收我放入集合中的第二个DOG
。 您可以通过更改放入dogList.get()
来扩展此以删除第n
个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;
}
以下是对它的实际应用的一点测试: http : //pastebin.com/yX1v6L9p (注意,不严格需要显式类型参数。)
这通过使用泛型和Class方法isAssignableFrom来检查列表中对象的类型与所需类型。
像这样使用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)));
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.