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
Productnã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 estendaParentTypepossa ser utilizada no lugar de?. Nesse contexto, a palavraextendsconsidera 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 tipoTypeou 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 Strings é 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.