この仮定は、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
して、特定の型を知る必要がなく、共通インターフェイスのメソッドを呼び出すだけでよいかもしれません。