? extends HasWord
significa "Uma classe / interface que se estende HasWord
". Em outras palavras, HasWord
ele próprio ou qualquer um de seus filhos ... basicamente qualquer coisa que funcione com instanceof HasWord
mais 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 List
fim de reordenar a própria lista.