? extends HasWord
significa "Una clase / interfaz que se extiende HasWord". En otras palabras, HasWordsí mismo o cualquiera de sus hijos ... básicamente cualquier cosa que funcione con instanceof HasWordplus null.
En términos más técnicos, ? extends HasWordes un comodín acotado, cubierto en el Artículo 31 de Effective Java 3rd Edition , que comienza en la página 139. El mismo capítulo de la 2da Edición está disponible en línea como PDF ; la parte de los comodines delimitados es el Artículo 28 que comienza en la página 134.
Actualización: el enlace PDF se actualizó desde que Oracle lo eliminó hace un tiempo. Ahora apunta a la copia presentada por la Escuela de Ingeniería Electrónica e Informática de la Universidad Queen Mary de Londres.
Actualización 2: Veamos un poco más de detalles sobre por qué querría usar comodines.
Si declara un método cuya firma espera que pase List<HasWord>, entonces lo único que puede pasar es a List<HasWord>.
Sin embargo, si dicha firma era, List<? extends HasWord>entonces podría pasar un en su List<ChildOfHasWord>lugar.
Tenga en cuenta que hay una sutil diferencia entre List<? extends HasWord>y List<? super HasWord>. Como dijo Joshua Bloch: PECS = productor-se extiende, consumidor-super.
Lo que esto significa es que si está pasando una colección de la cual su método extrae datos (es decir, la colección está produciendo elementos para su método), debe usarla extends. Si está pasando una colección a la que su método agrega datos (es decir, la colección está consumiendo elementos que crea su método), debe usarla super.
Esto puede sonar confuso. Sin embargo, puede verlo en Listel sortcomando de (que es solo un acceso directo a la versión de dos argumentos de Collections.sort). En lugar de tomar un Comparator<T>, en realidad se necesita un Comparator<? super T>. En este caso, el Comparador está consumiendo los elementos del Listpara reordenar la Lista misma.