2013-10-10 28 views
0

我有一個類帶有派生類的動畫動作,喜劇和戲劇。我有一個名爲rentedMovies的不同電影陣列。使用Java中的foreach循環使用派生類

當我循環使用簡單的for循環在陣列上,

for(int i = 0; i < rentedMovies.lenght; i++){ 
    ..Do something.. 
} 

的的IntelliJ IDE表明,我可以改變這個循環來的foreach。

for(Movie movie: rentedMovies){ 
..Do something.. 
} 

但這並不意味着我的所有電影元素都將被視爲Movie類的對象而不是派生類的對象嗎? 這是IDE的一個錯誤的建議,還是我不正確?謝謝。

+0

取決於。什麼是'rentedMovies'聲明?另請參閱多態性。 –

+0

所以一個類Rental有一個Movie實例變量。 rentedMovies是租賃對象數組 – Nitin

+0

您可以使用'instanceof'來確定它是哪種類型的子類 –

回答

2

這個假設已經通過rendedMovies聲明類似

ArrayList<Movie> rentedMovies 

這樣最具體的信息,你就可以知道包含在集合中的對象的事實暗示是他們Movie類型。你不得不在Java中這樣做,因爲泛型集合只能具有特定的類型。爲了能夠將所有子類添加到集合中,您必須提供一個公共超類。

將對象添加到類時,類型信息會丟失。例如:

Comedy comedy = new Comedy(); 
rentedMovies.add(comedy); 
Comedy comedy2 = rentedMovies.get(0); // compile error: get returns Movie 
Movie movie = rentedMovie.get(0); // correct 

總之,如果你不需要當前電影的索引,你的片段是等價的。 請注意for-each語句與引擎蓋下的迭代器一起工作,所以如果您要修改循環內的集合,那麼您必須注意你在做什麼

如果你想獲得一次從集合中檢索元素的特定信息,那麼你必須垂頭喪氣它自己(而忘記編譯無需專人檢查類型安全),例如:

public Comedy asComedy() { 
    return this instanceof Comedy ? (Comedy)this : null; 
} 

但是如果你需要要做到這一點,那麼你應該重新設計繼承。也許你可以將行爲完全移到Movie的子類中,這樣你就不需要知道具體的類型,只需調用通用接口的方法即可。

+0

謝謝。這清除了事情。 – Nitin

1

您的rentedMovies無論如何,我假設被聲明爲Movies[]所以原始的for循環仍然會將它們作爲Movie對象。

如果你想使用子類的特定方法,那麼你將不得不在兩種情況下投。

使用(int i = 0; i < rentedMovies.lenght; i++)實施的好處是,你有索引,如果你需要不循環的entired陣列相對(當時的IntelliJ不會給你這個警告)或索引位置當前的Object

1

如果你有一個不同類型的數組,那麼Array變量的類型應該是一個超類。

無論如何,如果你要在循環中搜索特定類型的電影,你必須做明確的檢查(不是很好的設計)。

所以它真的沒有區別你使用的循環......對於每一個將會更簡單並且沒有缺點。

1

如果在一個數組中有「動作,喜劇和戲劇」,則租用的電影必須是「電影」類。因此,如果您通過for循環遍歷它們,則將它們像「電影」一樣迭代,而不像「動作,喜劇或戲劇」。

建議的IDE迭代與您使用的相同,但可能更直觀一些,如果您決定將數組更改爲List,則可用於很多類(如List)。