Sobes.tech
Junior — Middle

Qual é a diferença entre as palavras-chave extends e super ao usar generics em Java?

sobes.tech IA

Resposta da IA

Em Java, ao trabalhar com genéricos, as palavras-chave extends e super são usadas para restringir os tipos e influenciam a covariância e a contravariância.

  • ? extends T — restrição superior (covariância). Permite usar o tipo T ou qualquer subclasse dele. Isso significa que é possível ler objetos do tipo T da coleção, mas não é possível adicionar objetos de forma segura a essa coleção (exceto null).

  • ? super T — restrição inferior (contravariância). Permite usar o tipo T ou qualquer superclasse dele. Isso significa que é possível adicionar objetos do tipo T à coleção, mas ao ler, só se pode obter objetos do tipo Object ou de um tipo mais geral.

Exemplo:

List<? extends Number> listExtends = new ArrayList<Integer>();
Number num = listExtends.get(0); // Pode ler como Number
// listExtends.add(10); // Erro de compilação

List<? super Integer> listSuper = new ArrayList<Number>();
listSuper.add(10); // Pode adicionar Integer
Object obj = listSuper.get(0); // Ao ler, o tipo é Object

Assim, extends é usado quando se precisa ler dados da estrutura, e super quando se precisa escrever dados.