假设我有以下类的层次结构:
public class MainClass {
}
class A extends MainClass {
}
class B extends MainClass {
}
class C extends MainClass {
}
Run Code Online (Sandbox Code Playgroud)
现在假设我有一个List<MainClass> classes
看起来像:
{A, MainClass, A, B, B, MainClass, C, A, C, B, A}
Run Code Online (Sandbox Code Playgroud)
我希望能够通过他们的班级挑选出对象的子列表.例如,我希望能够仅提取此类A列表中的那些类(但不能提取类MainClass).因此,使用isAssignableFrom(A.class)对我不起作用.
我目前的方法如下:
public <T extends MainClass> List<T> getClasses(List<MainClass> classes, Class classToCollect) {
List<T> subclasses = new ArrayList<T>();
for (MainClass clazz : classes) {
if (clazz.getClass().isInstance(classToCollect)) {
subclasses.add((T)clazz);
}
}
return subclasses;
}
Run Code Online (Sandbox Code Playgroud)
这仍然不起作用并传回一个空列表.什么给这里?
条件应如下所示:
for (MainClass obj : classes) {
if (classToCollect.isInstance(obj)) {
subclasses.add((T)obj);
}
}
Run Code Online (Sandbox Code Playgroud)
该名称clazz
具有误导性,因为它实际上是一个对象.
您可以通过Class<T>
在方法标题中使用来进一步提高代码的类型安全性:
public <T extends MainClass> List<T> getClasses(List<MainClass> classes, Class<T> classToCollect) {
...
}
Run Code Online (Sandbox Code Playgroud)
注意:如果你MainClass.class
作为第二个参数传递,这将不起作用(谢谢JB Nizet
,为了一个伟大的评论).