Sabemos que Generics provem uma sintaxe verdadeiramente bem complicada em alguns casos:
Vejamos, tenha os dois códigos abaixo:
1) Mais comum, e mais fácil de escrever e de ler!
public static void doStuff( List< ? super Dog > list )
{
list.add( new Dog() );
}
2) Não tão legível, mas provém a mesma função acima:
public static < T extends List<? super Dog> > void doStuff( T list )
{
list.add( new Dog() );
}
O que acontece, o que os métodos "dizem":
- pode ser passado qualquer que seja a coleção que seja subtipo da interface List e tenha como tipo Genérico Dog ou qualquer que seja sua superclasse;
- porém só podemos ADICIONAR tipos Dog
Por exemplo, se Dog IS-A Animal, poderiamos passar:
List<Animal> list = new ArrayList<Animal>();
ou
List<Dog> list = new ArrayList<Dog>();
que os métodos, OS DOIS, aceitariam!
Uma pegadinha seria:
List<Animal> list = new ArrayList<Animal>();
list.add( new Cat() ); // OK! Cat IS-A Animal
list.add( new Dog() ); // OK! Dog IS-A Animal
doStuff( list ) ; // OK! List IS-A List and Animal IS-A Animal!
Agora, mesmo eu passando uma lista de Animal no qual já contem um tipo Cat, dentro dos metodos não poderei adicionar nenhum Cat!
Para quem não tá ok com a sintaxe "T" ai vai!
T, é apenas uma conversão! Soa como "type"!
T, é o nosso tipo Genérico!
O que é "T"?
T extends X
Bem T é alguma coisa que extende X, onde X é
List<? super Dog>
assim T IS-A List<? super Dog>!
T é toda coleção que é subclasse de List e tem como Generic type TUDO que seja Dog OU Animal!
Bem, é isso!
Vamos colaborar!
Cada um colocando uma questão assim, ajuda bastante, pois veja muita gente lendo e acessando, mas poucos posts!
Está estudando? achou um assunto "pegadinha", um assunto ou questão dificil submete! Pode ser a mesma dúvida de muitos!
Abraços!