? extends HasWord
significa "Una classe / interfaccia che si estende HasWord
." In altre parole, HasWord
se stesso o uno dei suoi figli ... praticamente tutto ciò che avrebbe funzionato con il instanceof HasWord
plus 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 sort
di 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 List
per riordinare l'elenco stesso.