? extends HasWord
signifie "Une classe / interface qui s'étend HasWord
." En d'autres termes, HasWord
lui - même ou l'un de ses enfants ... essentiellement tout ce qui fonctionnerait avec instanceof HasWord
plus null
.
En termes plus techniques, il ? extends HasWord
s'agit d'un caractère générique délimité, couvert au point 31 de la version Java effective 3e , à partir de la page 139. Le même chapitre de la 2e édition est disponible en ligne au format PDF ; la partie sur les caractères génériques délimités est le point 28 à partir de la page 134.
Mise à jour: le lien PDF a été mis à jour depuis que Oracle l'a supprimé il y a quelque temps. Il pointe maintenant vers la copie hébergée par la School of Electronic Engineering and Computer Science de l'Université Queen Mary de Londres.
Mise à jour 2: permet d'entrer dans un peu plus de détails sur les raisons pour lesquelles vous souhaitez utiliser des caractères génériques.
Si vous déclarez une méthode dont la signature s'attend à ce que vous passiez List<HasWord>
, alors la seule chose que vous pouvez transmettre est a List<HasWord>
.
Cependant, si cette signature l'était, List<? extends HasWord>
vous pourriez passer un à la List<ChildOfHasWord>
place.
Notez qu'il existe une différence subtile entre List<? extends HasWord>
et List<? super HasWord>
. Comme l'a dit Joshua Bloch: PECS = producteur-étend, consommateur-super.
Cela signifie que si vous transmettez une collection à partir de laquelle votre méthode extrait des données (c'est-à-dire que la collection produit des éléments pour votre méthode), vous devez utiliser extends
. Si vous transmettez une collection à laquelle votre méthode ajoute des données (c'est-à-dire que la collection consomme des éléments créés par votre méthode), elle doit utiliser super
.
Cela peut sembler déroutant. Cependant, vous pouvez le voir dans List
la sort
commande de (qui n'est qu'un raccourci vers la version à deux arguments de Collections.sort). Au lieu de prendre un Comparator<T>
, il faut en fait un Comparator<? super T>
. Dans ce cas, le comparateur consomme les éléments de List
afin de réorganiser la liste elle-même.