gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:22:32 25 4
gpt4 key购买 nike

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

public class MainClass {

}

class A extends MainClass {

}

class B extends MainClass {

}

class C extends MainClass {

}

现在假设我有一个List<MainClass> classes看起来像:

 {A, MainClass, A, B, B, MainClass, C, A, C, B, A}

我希望能够按类挑选对象的子列表。例如,我希望能够仅提取 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;
}

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

最佳答案

条件应如下所示:

for (MainClass obj : classes) {
if (classToCollect.isInstance(obj)) {
subclasses.add((T)obj);
}
}

名称clazz具有误导性,因为它实际上是一个对象。

您可以使用 Class<T> 进一步提高代码的类型安全性在方法头中:

public <T extends MainClass> List<T> getClasses(List<MainClass> classes, Class<T> classToCollect) {
...
}

Demo on ideone.

注意:如果您通过MainClass.class,这将不起作用。作为第二个参数(感谢 JB Nizet 的精彩评论)。

关于Java抽象使用instanceof从List中收集类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24171999/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com