2013-07-03 65 views
3

繼承與for-each循環相關如何工作?想象一下,我有兩個類:​​和SuperClass,和我有以下ArrayList繼承是如何與for-each循環一起工作的?

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

是否有可能以這樣的方式來只能選擇subClasses遍歷superClasses

以下:

for(SubClass subClass : superClasses){ 
    // Do Foo 
} 

並沒有這樣做。 以下是我能得到工作的唯一的東西:但是我不想用instanceof,除非絕對必要

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

,我繼續閱讀無處不在(StackOverflow上,甲骨文教程等等),人們可以幾乎總是找到一個更好的解決方案來增加封裝。有沒有更好的方法來做到這一點?

+3

不,不是一個我能想到的。你需要使用'instanceof'! – NINCOMPOOP

+0

有點類似的問題:http://stackoverflow.com/questions/12623255/java-for-each-loop-iteration-over-extended-objects – NINCOMPOOP

+0

@DuncanJones請參閱編輯:) – maxf130

回答

5

那麼你可以寫一個輔助方法來隱藏instanceof測試... Guava有這樣的方法,例如,在Iterables.filter,你可以使用這樣的:

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

這只是移動instanceof雖然確實檢查 - 它並沒有擺脫它。從根本上說,你需要,辦理入住手續,因爲事情的必須做的過濾。

1

instanceof會在這種情況下工作精絕。但是,如果你真的有不使用它,你總是可以給超了一些變量,Boolean skipMe = true,並更改爲false,在子類中,如果你想的原因。

但我建議使用instanceof

2

第一種方法(for (SubClass subClass : superClasses))不能,因爲編譯器工作不能保證有在那裏tyoe​​的唯一對象。

在Java(無外部庫)就不可能預先選擇對Class。因此,instanceof是執行此操作的正常方法。

+0

我聲明它包含Sub-和SuperClass實例。 – maxf130

+1

@ maxf130我相應地改變了我的答案。 –

0

如果可能,我建議管理一個單獨的List,其中只包含SubClass的實例。

+0

_if possible_它不是:) – maxf130