? extends HasWord
significa "Una clase / interfaz que se extiende HasWord
". En otras palabras, HasWord
sí mismo o cualquiera de sus hijos ... básicamente cualquier cosa que funcione con instanceof HasWord
plus null
.
En términos más técnicos, ? extends HasWord
es 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 List
el sort
comando 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 List
para reordenar la Lista misma.