&lt? super&gt duvida

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&lt? super Banda&gt 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).

mais pq com extends nao posso add na ao conjunto?

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.