继承如何与每个循环一起工作?

时间:2013-07-03 12:07:59

标签: java inheritance foreach

继承如何与for-each循环相关?想象一下,我有两个课程:SubClassSuperClass,我有以下ArrayList

/**
* Containes both SuperClass and SubClass instances.
*/
ArrayList<SuperClass> superClasses = new ArrayList<SuperClass>(); 

是否可以以仅superClasses选择subClasses的方式迭代for(SubClass subClass : superClasses){ // Do Foo }

以下内容:

for(SuperClass superClass : superClasses){
    if(superClass instanceof SubClass){
        // Do Foo
    }
}

不这样做。 以下是我唯一可以开展的工作:

instanceof

但是我不想使用{{1}},除非绝对必要,因为我一直在阅读(StackOverflow,Oracle Tutorials等),人们几乎总能找到一个更好的解决方案来增加封装。有更优雅的方式吗?

4 个答案:

答案 0 :(得分:5)

那么你可以编写一个帮助方法来隐藏instanceof测试... Guava有一个像这样的方法,例如,在Iterables.filter中你可以像这样使用:

for (SubClass subclass : Iterables.filter(superclasses, SubClass.class)) {
    ...
}

它只是在移动instanceof检查,但它并没有摆脱它。从根本上说,你需要检查,因为有些东西需要进行过滤。

答案 1 :(得分:2)

第一种方法(for (SubClass subClass : superClasses))无法工作,因为编译器无法确保只有tyoe SubClass的对象。

在Java(没有外部库)中,无法在Class上进行预选。因此,instanceof是执行此操作的常规方法。

答案 2 :(得分:1)

在这种情况下,

instanceof绝对可以正常工作。但是如果你真的有理由不使用它,你总是可以给超类提供一些变量Boolean skipMe = true,如果你愿意,可以在子类中将其更改为false。

但我建议使用instanceof

答案 3 :(得分:0)

我建议管理一个单独的List,如果可能的话,它只包含SubClass的实例。