0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Java】なぜ List<Dog> は List<Animal> のサブクラスではないのか?【ジェネリクス】

Posted at
// Animalリストを受け取って出力するメソッド
private void printList(List<Animal> list)

// 上記メソッドにDogリストを渡す
List dogs = getDogList();
printList(dogs);

DogAnimal のサブクラスだから動作しそう。
でも、これは動作しない。

DogAnimal のサブクラスだとしても、
List<Dog>List<Animal> のサブクラスとは見なされない!

どうして...

なぜ List だとサブクラスと見なされない?

list.add( new Cat() );

CatAnimal のサブクラスなのでこれは問題ない。

ところが、listの中身が List<Dog> だった場合、
List<Dog>Cat を格納することになっる!

そういうわけで以下は動作しない。

・List<Animal> ← List<Dog>

これを解決する、ジェネリクスのワイルドカード

そこで登場するのがジェネリクスのワイルドカード!

// Animalリストを受け取って出力するメソッド
private void printList(List<? extends Animal> list)

こうやって書けば、期待通りに動きます。
つまり List<Animal>、List<Dog>、List<Cat> たちが
渡せるようになります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?