[英]How does inheritance work with for-each loops?
繼承如何與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
除非絕對必要,因為我一直在閱讀(StackOverflow,Oracle Tutorials等),人們幾乎總能找到一個更好的解決方案來增加封裝。 有更優雅的方式嗎?
那么你可以編寫一個幫助方法來隱藏testof instanceof
...... Guava有一個像這樣的方法,例如,在Iterables.filter
,你可以像這樣使用:
for (SubClass subclass : Iterables.filter(superclasses, SubClass.class)) {
...
}
它實際上只是移動了檢查instanceof
- 它並沒有擺脫它。 從根本上說,你需要檢查,因為有些東西需要進行過濾。
第一種方法( for (SubClass subClass : superClasses)
)不能工作,因為編譯器無法確保那里只有tyoe SubClass
對象。
在Java(沒有外部庫)中,無法在Class
上進行預選。 因此, instanceof
是執行此操作的常規方法。
在這種情況下, instanceof
絕對可以正常工作。 但是如果你確實有理由不使用它,你總是可以給超類提供一些變量, Boolean skipMe = true
,如果你願意,可以在子類中將其改為false。
但我建議使用instanceof
我建議管理一個單獨的List,如果可能的話,它只包含SubClass的實例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.