Generics - Tipos e parametros

3 respostas
O

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&lt ? super Dog &gt  list )
{

list.add( new Dog() );

}

2) Não tão legível, mas provém a mesma função acima:

public static &lt T extends List&lt? super Dog&gt &gt 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&lt;Animal&gt; list = new ArrayList&lt;Animal&gt;();

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!

3 Respostas

J
No caso poderia ser também ?

public static void doStuff( List< T extends Animal >  list )

{

list.add( new Dog() );

}

rodrigo_lm

Muito bom seu post oalexandrino, estava com duvidas com e , agora ficou bem claro…

Muito obrigado…

Uma coisa a menos que eu não entendo :roll:

O
jr.mg:
No caso poderia ser também ? public static void doStuff( List< T extends Animal > list ) { list.add( new Dog() ); }

não porque voce precisa especificar o que é T!
no codigo que voce postou nao ha informacao sobre o ele!

o correto seria

static <T extends Animal> void doStuff(List<T> list)
	{
		
	}

rodrigo, tudo bem!

Vivemos e aprendemos!

Criado 9 de dezembro de 2006
Ultima resposta 9 de jan. de 2007
Respostas 3
Participantes 3