Parce que rien n'interdit de prendre une List de type connu et de la considérer soudainement comme une List de type inconnu :
List<?> list = new ArrayList<Integer>();
C'est pareil et c'est légal. J'ai pris une List<Integer> et je l'ai donnée à quelque chose qui attend une List<?>.
Ça marche, et ça ne pose pas de problème, car la cohérence de typage reste assurée.
Ma List<?> étant de type inconnu, elle ne me donnera que des Object et ne peut donc pas se tromper. Et elle n'acceptera pas que j'y insère quoi que ce soit, aucune tentative ne compilera. La List<Integer> qu'elle était à l'origine ne contient donc bien rien d'autre que des Integer, puisque je n'ai pas pu y mettre autre chose. Où qu'on regarde, il n'y a aucune incohérence.
Partager