? extends HasWord
signifie "Une classe / interface qui s'étend HasWord." En d'autres termes, HasWordlui - même ou l'un de ses enfants ... essentiellement tout ce qui fonctionnerait avec instanceof HasWordplus null.
En termes plus techniques, il ? extends HasWords'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 Listla sortcommande 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 Listafin de réorganiser la liste elle-même.