继承如何与for-each循环相关?想象一下,我有两个课程:SubClass
和SuperClass
,我有以下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等),人们几乎总能找到一个更好的解决方案来增加封装。有更优雅的方式吗?
答案 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的实例。