Pour l'échantillon de code suivant:Java Generics: affectation avec des paramètres génériques imbriqués
public static class Abc<X> { }
public static class Def<Y> { }
public static class Ghi<Z> { }
public void doThis() {
List<?> listOne;
List<Abc<?>> listTwo;
List<Abc<Def<?>>> listThree;
List<Abc<Def<Ghi<?>>>> listFour;
List<Abc<Def<Ghi<String>>>> listFive;
Abc<Def<Ghi<String>>> abcdef;
abcdef = new Abc<Def<Ghi<String>>>();
listOne.add(abcdef); // line 1
listTwo.add(abcdef); // line 2
listThree.add(abcdef); // line 3
listFour.add(abcdef); // line 4
listFive.add(abcdef); // line 5
}
lignes 1, 3 et 4 ne compile pas:
(ligne 1)
The method add(capture#1-of ?) in the type List<capture#1-of ?> is not applicable for the arguments (Abc<Def<Ghi<String>>>)
(ligne 3)
The method add(Abc<Def<?>>) in the type List<Abc<Def<?>>> is not applicable for the arguments (Abc<Def<Ghi<String>>>)
(ligne 4)
The method add(Abc<Def<Ghi<?>>>) in the type List<Abc<Def<Ghi<?>>>> is not applicable for the arguments (Abc<Def<Ghi<String>>>)
lignes 2 et 5, cependant, la compilation.
Quelqu'un peut-il expliquer pourquoi les lignes 1, 3 et 4 ne sont pas des attributions légales? Et si les paramètres génériques ne peuvent pas être utilisés de cette façon sur ces lignes, alors pourquoi l'affectation sur la ligne 2 est-elle légale?
Très bonne question! Pour * ligne 1 *, c'est parce que vous ne pouvez rien ajouter à une liste de type inconnu sauf 'null'. – rlegendi