Tenho algumas dúvidas sobre caracteres curinga genéricos em Java:
Qual é a diferença entre
List<? extends T>
eList<? super T>
?O que é um curinga limitado e o que é um curinga ilimitado?
java
generics
bounded-wildcard
Pablo Fernandez
fonte
fonte
Respostas:
Em sua primeira pergunta,
<? extends T>
e<? super T>
são exemplos de curingas delimitados. Um curinga ilimitado se parece com<?>
e basicamente significa<? extends Object>
. Isso significa vagamente que o genérico pode ser de qualquer tipo. Um caractere curinga limitado (<? extends T>
ou<? super T>
) restringe o tipo, dizendo que ele deve estender um tipo específico (<? extends T>
é conhecido como limite superior) ou deve ser um ancestral de um tipo específico (<? super T>
conhecido como limite inferior) .Os Tutoriais Java têm algumas explicações muito boas sobre genéricos nos artigos Wildcards e More Fun with Wildcards .
fonte
<? super C>
significaria que seu tipo está restrito a algo acimaC
na hierarquia de tipos. (Desculpe pela resposta extremamente tardia. Acho que não recebemos notificações de comentários há 2 anos?)Se você tem uma hierarquia de classes A, B é uma subclasse de A, e C e D são subclasses de B como abaixo
Então
Um curinga limitado é como
? extends B
onde B é algum tipo. Ou seja, o tipo é desconhecido, mas um "limite" pode ser colocado nele. Nesse caso, ele é limitado por alguma classe, que é uma subclasse de B.fonte
List<? super B>
descreve como List aceita o tipo que é a classe pai da classe B ? É por isso que C e D não compilam hmm?Josh Bloch também tem uma boa explicação de quando usar
super
eextends
nesta conversa de vídeo do google io onde ele menciona o mnemônico Produtorextends
Consumidorsuper
.Dos slides da apresentação:
fonte
Pode haver momentos em que você desejará restringir os tipos de tipos que podem ser passados para um parâmetro de tipo. Por exemplo, um método que opera em números pode aceitar apenas instâncias de Number ou suas subclasses. É para isso que servem os parâmetros de tipo limitado.
significa que pode aceitar todos os objetos que tenham relacionamento IS-A com MyObject (ou seja, qualquer objeto que seja um tipo de myObject ou podemos dizer qualquer objeto de qualquer subclasse de MyObject) ou um objeto da classe MyObject.
Por exemplo:
Então,
irá aceitar apenas MyObject ou filhos de MyObject (ou seja, qualquer objeto do tipo OurObject ou YourObject ou MyObject, mas não qualquer objeto da superclasse de MyObject).
fonte
Em geral,
Para colocar elementos na estrutura, precisamos de outro tipo de curinga chamado
Wildcards with super
,fonte
Os curingas genéricos são criados para tornar os métodos que operam na coleção mais reutilizáveis.
Por exemplo, se um método possui um parâmetro
List<A>
, só podemos darList<A>
a este método. É um desperdício para a função deste método em algumas circunstâncias:List<A>
, então devemos ter permissão para darList<A-sub>
a este método. (Porque A-sub É um A)List<A>
, então devemos ter permissão para darList<A-super>
a este método. (Porque A É um Super Super)fonte