Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java抽象使用instanceof从列表中收集类_Java - Fatal编程技术网

Java抽象使用instanceof从列表中收集类

Java抽象使用instanceof从列表中收集类,java,Java,假设我有以下层次结构的类: public class MainClass { } class A extends MainClass { } class B extends MainClass { } class C extends MainClass { } 现在假设我有一个列表类,如下所示: {A, MainClass, A, B, B, MainClass, C, A, C, B, A} public <T extends MainClass> List&l

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

public class MainClass {

}

class A extends MainClass {

}

class B extends MainClass {

}

class C extends MainClass {

}
现在假设我有一个
列表类
,如下所示:

 {A, MainClass, A, B, B, MainClass, C, A, C, B, A}
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;
}
我希望能够根据对象的类来选择对象的子列表。例如,我希望能够仅提取类A列表中的那些类(而不是类MainClass)。因此,使用isAssignableFrom(A.class)对我来说不起作用

我当前的方法如下所示:

 {A, MainClass, A, B, B, MainClass, C, A, C, B, A}
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;
}
public List getClasses(List Class,Class classToCollect){
列表子类=新的ArrayList();
对于(主课堂:课堂){
if(clazz.getClass().isInstance(classToCollect)){
子类。添加((T)clazz);
}
}
返回子类;
}

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

条件应如下所示:

for (MainClass obj : classes) {
    if (classToCollect.isInstance(obj)) {
        subclasses.add((T)obj);
    }
}
名称
clazz
具有误导性,因为它实际上是一个对象

通过在方法标题中使用
Class
,可以进一步提高代码的类型安全性:

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


注意:如果将
MainClass.class
作为第二个参数传递,这将不起作用(感谢
JB Nizet
,感谢您的宝贵意见)。

使用Java 8,您可以这样表达:

public <T> List<T> getClasses(List<? super T> instances, Class<T> classToCollect) {
    return instances.stream()
                    .filter(c -> c.getClass() == classToCollect)
                    .map(c -> (T) c)
                    .collect(Collectors.toList());
}

public List getClasses(List为什么不看看类对象是否相等?这同样适用于
clazz.getClass().getName().equals(A.class.getName())
clazz.getClass().equals(A.class)
List类型的参数应命名为类似“objects”的名称。它不是类es的列表,而是对象的列表。类似地,for循环变量应命名为类似对象的名称,同样,它将保存对象而不是类。术语class而不是instance/object的用法更像是OP方面的误解.Oops,
clazz
是我的错。
class
最初是被使用的,所以在有人抱怨语法不好之前我就修改了它。我应该修改它吗?我想知道java 8的等价物是什么,因为人们会希望做一个简单的
.OfType()
,就像你在现代语言中看到的那样…@HighCore
classes.stream().filter(A.class::isInstance)
不确定这是否是OP的问题,但如果他还希望通过传递MainClass.class来获得不是A、B或C实例的MainClass实例,那将不起作用。在这种情况下,他必须检查这些类是否相等。