// Animalリストを受け取って出力するメソッド
private void printList(List<Animal> list)
// 上記メソッドにDogリストを渡す
List dogs = getDogList();
printList(dogs);
Dog は Animal のサブクラスだから動作しそう。
でも、これは動作しない。
Dog が Animal のサブクラスだとしても、
List<Dog> は List<Animal> のサブクラスとは見なされない!
どうして...
なぜ List だとサブクラスと見なされない?
list.add( new Cat() );
Cat は Animal のサブクラスなのでこれは問題ない。
ところが、listの中身が List<Dog> だった場合、
List<Dog> に Cat を格納することになっる!
そういうわけで以下は動作しない。
・List<Animal> ← List<Dog>
これを解決する、ジェネリクスのワイルドカード
そこで登場するのがジェネリクスのワイルドカード!
// Animalリストを受け取って出力するメソッド
private void printList(List<? extends Animal> list)
こうやって書けば、期待通りに動きます。
つまり List<Animal>、List<Dog>、List<Cat> たちが
渡せるようになります。