3

继承如何与 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,因为我一直在到处阅读(StackOverflow、Oracle 教程等),几乎总能找到一种更好的解决方案来增加封装性。有没有更优雅的方式来做到这一点?

4

4 回答 4

5

好吧,您可以编写一个辅助方法来隐藏instanceof测试... Guava有一个这样的方法,例如 in Iterables.filter,您可以像这样使用它:

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

它只是移动instanceof支票,虽然真的 - 它并没有摆脱它。从根本上说,您需要进行检查,因为必须进行过滤。

于 2013-07-03T12:11:37.690 回答
2

第一种方法 ( for (SubClass subClass : superClasses)) 不起作用,因为编译器无法确保其中只有 tyoe 对象SubClass

在 Java(没有外部库)中,无法在Class. 因此,这instanceof是执行此操作的正常方法。

于 2013-07-03T12:12:08.397 回答
1

instanceof在这种情况下绝对可以正常工作。但是,如果您确实有不使用它的理由,您总是可以给超类一些变量,Boolean skipMe = true如果您愿意,可以在子类中将其更改为 false。

但我建议使用instanceof

于 2013-07-03T12:12:07.850 回答
0

如果可能,我建议管理一个仅包含子类实例的单独列表。

于 2013-07-03T12:15:06.423 回答