web-dev-qa-db-fra.com

Pourquoi nous ne pouvons pas faire List <Parent> mylist = ArrayList <child> ();

Pourquoi nous ne pouvons pas faire

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

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.

119
Jon Skeet

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).

5
Donal Fellows