簡體   English   中英

繼承如何與每個循環一起工作?

[英]How does inheritance work with for-each loops?

繼承如何與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 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM