ae pessoal, pq <? super tipo> permite que seja adicionado ao conjunto e com extends nao eh permitido?
import java.util.*;
class Carnaval{}
class Banda extends Carnaval{}
class Chi{
public void carna(List<? super Banda> band){
band.add(new Banda());
}
public static void main(String [] agr){
Chi ch = new Chi();
List<Carnaval> lis = new ArrayList<Carnaval>();
ch.carna(lis);
}
}
Bom, vamos ver se eu não me confundo aqui… lá vai:
Primeiro: um método que recebe List<? super Banda> pode receber: List<Banda>, List<Carnaval> ou List<Object>. Ou seja, pode receber uma lista de qualquer coisa que é no máximo uma Banda.
Se você sabe que sua Lista, independente de qual for é uma lista de no máximo uma Banda, você pode colocar uma Banda lá dentro. Isso porque uma Banda é uma Banda, é um Carnaval e é um Object.
Mas, com o você não sabe o tipo especifico da Lista, se voce der um get voce recebera um Object (nao testei mas é o que faz mais sentido).
o ? extends Banda não pode adicionar porque a lista pode ser, por exemplo, uma lista de uma classe X que extends Banda. Ai se voce adicionar uma banda, vai quebrar o type safety que o generics da.