? extends HasWord
significa "Una classe / interfaccia che si estende HasWord." In altre parole, HasWordse stesso o uno dei suoi figli ... praticamente tutto ciò che avrebbe funzionato con il instanceof HasWordplus null.
In termini più tecnici, ? extends HasWordè un carattere jolly limitato, coperto nell'articolo 31 di Effective Java 3rd Edition , a partire da pagina 139. Lo stesso capitolo della 2a edizione è disponibile online in formato PDF ; la parte su caratteri jolly limitati è l'articolo 28 a partire da pagina 134.
Aggiornamento: il collegamento PDF è stato aggiornato da quando Oracle l'ha rimosso qualche tempo fa. Indica ora la copia ospitata dalla School of Electronic Engineering and Computer Science della Queen Mary University di Londra.
Aggiornamento 2: Andiamo un po 'più in dettaglio sul motivo per cui dovresti usare i caratteri jolly.
Se dichiari un metodo la cui firma prevede che tu passi List<HasWord>, l'unica cosa che puoi trasmettere è a List<HasWord>.
Tuttavia, se detta firma fosse, List<? extends HasWord>allora potresti passare un List<ChildOfHasWord>.
Si noti che esiste una sottile differenza tra List<? extends HasWord>e List<? super HasWord>. Come diceva Joshua Bloch: PECS = produttore-amplia, consumatore-super.
Ciò significa che se stai passando in una raccolta da cui il tuo metodo estrae i dati (ovvero la raccolta sta producendo elementi che il tuo metodo può usare), dovresti usare extends. Se stai passando a una raccolta a cui il tuo metodo aggiunge dati (ovvero la raccolta sta consumando elementi che il tuo metodo crea), dovrebbe usarlo super.
Questo può sembrare confuso. Tuttavia, si può vedere in List's sortdi comando (che è solo una scorciatoia per la versione a due ARG di Collections.sort). Invece di prendere un Comparator<T>, in realtà ci vuole un Comparator<? super T>. In questo caso, il comparatore utilizza gli elementi di Listper riordinare l'elenco stesso.