2013-12-10 30 views
1
for (SubItem i : List<Item>) { 
    //do something   
} 

以上構造不起作用。我需要在循環中多次使用i變量。我目前的解決方案是在第一行中創建一個新的,鑄造的,可變的。對於集合中的每個子元素,Java

for (Item i : List<Item>) { 
SubItem si = (SubItem) i; 
//do something  
} 

有沒有更好的方法來做到這一點?

編輯: 列表中的所有項目都是子項目,所以我不必檢查instanceOf。基本上我想要的是一種方法,以避免檢查類的實例,如果我有一個炒匯集

+3

由於名單隻有子項,那麼爲什麼你不能列出而不是名單? – AJJ

+0

我可以。但我首先處於愚蠢的位置,因爲我的學校任務是:「表明你理解polymorpishm」 – user2651804

回答

1

您不能自動投射到更詳細的類型。你可以做相反的事情:

List<SubItem> subItemList = new ArrayList<SubItem>(); 
for (Item i : subItemList) { 
    //do something   
} 

你的情況,你必須手動施放,比如像這樣:

List<Item> itemList = new ArrayList<Item>(); 
List<SubItem> subItemList = (List) itemList; 
for (SubItem i : subItemList) { 
    //do something   
} 

我做演員是沒有故意泛型類型。使用提供的通用類型(List<SubItem>)它不會編譯。請記住,如果itemList中的任何元素不是SubItem類型,那麼在執行類似演員時您將獲得RuntimeException。

0
for (SubItem i : List<Item>) { 
    //do something   
} 

這顯然是錯誤的。你必須使用支持每個循環的類的對象而不是類名。

List<Item> itemList = new ArrayList<Item>(); 
for (SubItem i : itemList) { 
    //do something   
} 

此外,多態性是使用超類引用的子類對象,而不是其他方式。所以如果你的列表包含Item對象,並且你需要在你的循環中使用SubItem,你需要輸入cast。或者維護一個SubItem而不是Item的列表(採用泛型方式)。

+0

itemList有項目,並且在for循環中它是子項目??? – AJJ

+0

我的意思是,當您創建列表時,您將項目提供爲泛型。然後,您可以將任何對象添加到其類擴展Item類(SubItem)的列表中。 –

+0

是的。這是正確的。得到它了。你的回答現在表明了這一點。 – AJJ

0

試試這個..

List<Item> itemList = ...; 
for (SubItem i : (List<SubItem>)(Object)itemList) { 
    //do something   
} 

仿製藥不投與繼承同樣的方式有規則物體做。如果需要,可以將項目列表轉換爲SubItem列表。我發現我需要通過Object來施放,以使編譯器接受它。當然,如果列表不包含SubItem,它將在從列表中選擇時導致類別強制轉換。無論如何,泛型當然大多隻是語法糖。把它們想象成在幕後進行的演員。

+0

根據Moyshe的回答,我們可能會通過(List)而不是對象進行投射。 – slipperyseal

相關問題