Pourquoi nous ne pouvons pas faire
List<Parent> mylist = ArrayList<child>();
Supposons que nous le puissions. Ensuite, ce programme devrait être bien:
ArrayList<Banana> bananas = new ArrayList<Banana>();
List<Fruit> fruit = bananas;
fruit.add(new Apple());
Banana banana = bananas.get(0);
Ce n'est clairement pas sûr pour le type - vous vous êtes retrouvé avec un Apple dans la collection de bananes.
Ce que vous pouvez faire est:
List<? extends Fruit> fruit = new ArrayList<Banana>();
c'est sûr, car le compilateur ne vous laissera pas essayer d'ajouter à la liste des fruits. Il sait que c'est une liste d'une sorte de fruit, vous pouvez donc écrire:
Fruit firstFruit = fruit.get(0);
mais il ne sait pas de quel type de fruit il s'agit exactement, et assurez-vous que vous ne pouvez pas faire la mauvaise chose.
Voir la FAQ sur les génériques Java une autre explication.
Parce qu'ils ne sont pas du même type. Supposons que vous ayez une autre classe enfant de Parent
(Child2
pour les besoins de l'argument), il serait alors possible de mettre une instance de Child2
dans une List<Parent>
, mais de type incorrect pour le mettre dans une instance de List<Child>
. L'héritage covariant est un vrai casse-tête et n'est pris en charge que dans Java pour les types de tableaux (où il peut causer des problèmes étranges).