考虑这样的层次结构:
class A {}
class B extends A {}
class C extends A {}
class D extends C {}
还有一个存储这些类的对象的列表:
List<A> myObjects = new ArrayList<>();
myObjects.add(new A());
myObjects.add(new B());
myObjects.add(new C());
myObjects.add(new C());
myObjects.add(new D());
现在,我想创建一个通用函数,该函数将允许我查找特定类型的对象(受C#中Unity的GameObject.FindGameObjectsOfType<T>()
函数的启发)。
这是我的方法:
static <T extends A> List<T> findObjectsOfType(List<A> list) {
List<T> newList = new ArrayList<>();
for (A a : list) {
if (a instanceof T) {
newList.add((T)a);
}
}
return newList;
}
但这会产生错误,因为T
在运行时中丢失了,所以我无法检查a
是否是T
的实例。实现这样的功能的正确方法是什么?
所需的通话输出:
findObjectsOfType<C>(myObjects);
将是一个List<C>
,其中前面添加了2个元素(没有继承的D
类对象)