Utilização de genéricos
- Não podem ser utilizados com classes descendentes de
Throwable
, classes anônimas e enumerações.
- Nomes padrões utilizados são T para um tipo, V para um valor e K para uma chave.
- São invariantes. Isso quer dizer que um genérico de
Product
não aceita uma instância que seja de uma subclasse deProduct
.
Curinga (wildcard ou "?")
- Representa um tipo desconhecido. Quando utilizado sozinho aceita apenas
null
, já que nenhum objeto em Java é de tipo desconhecido.
- Pode ser limitado por cima (upper bounded wildcard):
<? extends ParentType>
. Isso torna o genérico covariante, permitindo que qualquer instância que estendaParentType
possa ser utilizada no lugar de?
. Nesse contexto, a palavraextends
considera implementação de interfaces ou extensão de classes. É covariante e só pode ser usada em genéricos de leitura.
- Pode ser limitado por baixo (lower bounded wildcard):
<? super Type>
. Aceita uma instância do tipoType
ou qualquer tipo que ela implemente ou estenda. É contra-variante e pode ser utilizada para escrita.
- Quando a hierarquia for irrelevante prefere-se utilizar o tipo específico, evitando o caractere curinga. Genéricos específicos são invariantes e podem ser utilizados para leitura e escrita.
- Genéricos curinga "sem limites" acabam sendo implicitamente
<? extends Object>
.
Ordenação
Interface Comparable
É utilizado para implementar o método
compareTo
comparando elementos através da ordem natural do objeto. Por exemplo, a ordem natural de uma lista de String
s é a alfabética, para ordena-las pela quantidade de caracteres a interface Comparator
deveria ser utilizada.- Quem implementa ela é o objeto a ser comparado.
Interface Comparator
Utilizada para comparar objetos de uma forma específica, diferente da natural, implementada por
Comparable
.- Ela é implementada por uma classe externa aos objetos sendo comparados.