Ne peut pas ajouter de la valeur à la Java collection avec des caractères génériques de type générique

Pourquoi ce code ne compile pas (Parent est une interface)?

List<? extends Parent> list = ...
Parent p = factory.get();   //returns concrete implementation
list.set(0, p);   //fails here: set(int, ? extends Parent) cannot be applied to (int, Parent)
Vous pourriez penser List<? extends Parent> est "une liste de choses qui s'étend Parent", mais ce n'est pas réellement ce qu'il signifie. Il signifie "il existe un certain type de C, tels que C s'étend Parent, et c'est une Liste de C." Puisque nous ne savons pas ce que C est, nous ne savons pas que l'un des Parents est un C, de sorte que vous ne pouvez pas mettre un Parent dans un List<C>. C est appelé un type de capture.) Mais, vous pouvez en prendre une, parce que vous obtenez C de la Liste, et C est-un Parent, donc c'est bien.

OriginalL'auteur Sergey Mikhanov | 2010-09-15