Genéricos e Ordenação

Created
Mar 21, 2021 09:58 PM
Objetivo
Revisar
Estado
Finalizado

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 de Product.

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 estenda ParentType possa ser utilizada no lugar de ?. Nesse contexto, a palavra extends 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 tipo Type 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 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.