Je crois que le type ?
dans les génériques est un type inconnu spécifique . Ce qui signifie que déclarer, disons, une liste de ce type nous empêcherait d'y ajouter tout type d'objet.
List<?> unknownList;
unknownList.add(new Object()); // This is an error.
Le compilateur donne une erreur comme prévu.
Mais lorsque le type inconnu est un générique de second niveau, le compilateur ne semble pas s'en soucier.
class First<T> {}
List<First<?>> firstUnknownList;
// All these three work fine for some reason.
firstUnknownList.add(new First<>());
firstUnknownList.add(new First<Integer>());
firstUnknownList.add(new First<String>());
Je pensais que le compilateur ne se souciait probablement pas du tout du paramètre générique au deuxième niveau, mais ce n'est pas le cas,
List<First<Integer>> firstIntegerList;
firstIntegerList.add(new First<String>()); // This gives a compiler error as expected.
Alors, pourquoi le compilateur nous permet-il d'ajouter n'importe quel type d'élément alors que seul un élément inconnu (et donc rien) est acceptable dans le deuxième exemple ?
Note : Compilateur Java 1.8