できない理由
List<Parent> mylist = ArrayList<child>();
できるとしましょう。次に、このプログラムは問題ないはずです。
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 別の説明を参照してください。
同じ型ではないからです。 Parent
(引数のためにChild2
)の別の子クラスがあると仮定すると、Child2
のインスタンスをList<Parent>
に入れることができますが、 List<Child>
のインスタンスに配置するには、タイプが正しくありません。共変継承は本当の頭痛の種であり、Java)でのみサポートされます。