? extends HasWord
significa "Uma classe / interface que se estende HasWord". Em outras palavras, HasWordele próprio ou qualquer um de seus filhos ... basicamente qualquer coisa que funcione com instanceof HasWordmais null.
Em termos mais técnicos, ? extends HasWordé um curinga limitado, coberto no Item 31 do Effective Java 3rd Edition , a partir da página 139. O mesmo capítulo da 2ª Edição está disponível online como PDF ; a parte dos curingas delimitados é o Item 28, começando na página 134.
Atualização: o link do PDF foi atualizado desde que a Oracle o removeu há um tempo. Agora ele aponta para a cópia apresentada pela Escola de Engenharia Eletrônica e Ciência da Computação da Universidade Queen Mary de Londres.
Atualização 2: Vamos detalhar um pouco mais o motivo pelo qual você deseja usar caracteres curinga.
Se você declarar um método cuja assinatura espera que você passe List<HasWord>, a única coisa que você pode passar é a List<HasWord>.
No entanto, se a assinatura for essa List<? extends HasWord>, você poderá passar uma List<ChildOfHasWord>.
Observe que há uma diferença sutil entre List<? extends HasWord>e List<? super HasWord>. Como Joshua Bloch colocou: PECS = produtor-estende, consumidor-super.
O que isso significa é que, se você estiver passando uma coleção da qual seu método extrai dados (ou seja, a coleção está produzindo elementos para o seu método), você deve usá-la extends. Se você estiver passando uma coleção à qual seu método adiciona dados (ou seja, a coleção está consumindo elementos criados por seu método), ela deve ser usada super.
Isso pode parecer confuso. No entanto, você pode vê-lo no comando List's sort(que é apenas um atalho para a versão de dois argumentos do Collections.sort). Em vez de pegar um Comparator<T>, ele realmente leva um Comparator<? super T>. Nesse caso, o comparador está consumindo os elementos do a Listfim de reordenar a própria lista.