web-dev-qa-db-ja.com

List <Parent> mylist = ArrayList <child>();ができない理由

できない理由

List<Parent> mylist = ArrayList<child>();
61
Ismail Marmoush

できるとしましょう。次に、このプログラムは問題ないはずです。

ArrayList<Banana> bananas = new ArrayList<Banana>();
List<Fruit> fruit = bananas;
fruit.add(new Apple());

Banana banana = bananas.get(0);

それは明らかにタイプセーフではありません-あなたはバナナのコレクションでAppleになってしまいました。

あなたがcanすることは:

List<? extends Fruit> fruit = new ArrayList<Banana>();

これは安全です。コンパイラは、果物のリストにaddを試みることを許可しないからです。 ある種の果物のリストであることを知っているので、次のように書くことができます:

Fruit firstFruit = fruit.get(0);

しかし、それがどのような果物のリストであるかを正確に知りません。そして、あなたが間違ったことをしないようにしてください。

JavaジェネリックFAQ 別の説明を参照してください。

119
Jon Skeet

同じ型ではないからです。 Parent(引数のためにChild2)の別の子クラスがあると仮定すると、Child2のインスタンスをList<Parent>に入れることができますが、 List<Child>のインスタンスに配置するには、タイプが正しくありません。共変継承は本当の頭痛の種であり、Java)でのみサポートされます。

5
Donal Fellows