Per di codice seguente:generici Java: assegnazione con jolly nidificata Parametri
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
}
linee 1, 3, e 4 non compilare:
(line 1)
The method add(capture#1-of ?) in the type List<capture#1-of ?> is not applicable for the arguments (Abc<Def<Ghi<String>>>)
(riga 3)
The method add(Abc<Def<?>>) in the type List<Abc<Def<?>>> is not applicable for the arguments (Abc<Def<Ghi<String>>>)
(linea 4)
The method add(Abc<Def<Ghi<?>>>) in the type List<Abc<Def<Ghi<?>>>> is not applicable for the arguments (Abc<Def<Ghi<String>>>)
linee 2 e 5, tuttavia, la compilazione.
Qualcuno potrebbe spiegare perché le righe 1, 3 e 4 non sono assegnazioni legali? E se i parametri jolly non possono essere utilizzati in quel modo su quelle linee, allora perché l'assegnazione sulla linea 2 è legale?
Davvero una buona domanda! Per * linea 1 *, è perché non è possibile aggiungere nulla a un elenco di tipi sconosciuti ad eccezione di 'null'. – rlegendi