Java抽象使用instanceof从List中收集类

CB_*_*ick 2 java

假设我有以下类的层次结构:

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)

这仍然不起作用并传回一个空列表.什么给这里?

das*_*ght 6

条件应如下所示:

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)

在ideone上演示.

注意:如果你MainClass.class作为第二个参数传递,这将不起作用(谢谢JB Nizet,为了一个伟大的评论).

  • 不确定它是否是OP的问题,但如果他也希望通过传递MainClass.class来获取不是A,B和C实例的MainClass实例,那将无效.在那种情况下,他必须检查班级是否相等. (2认同)