usando ? super

 
 

import java.util.List;

import java.util.ArrayList;

 
 

class Animal{}

class Dog extends Animal {}

class Cat extends Animal {}

 
 

 
 

public class Teste {

public static void main(String[] args) {

List<Animal> animals = new ArrayList<Animal>();

animals.add(new Dog());

animals.add(new Cat());

 
 

// invoca o método e pega o retorno que é uma List.

List lst = doStuff(animals);

 
 

// adiciona mais itens a lista retornada pelo método

lst.add(new Animal());

lst.add(444);

 
 

// imprime o retorno da função doStuff() que é uma simples lista

int i = 0;

for(Object o:lst) System.out.println(i++ + ” – ” + o);

 
 

// aqui tentaremos imprimir a lista ‘animals’ que foi passada como parâmetro para o método ‘doStuff()’.

// agora teremos problemas:

i = 0;

System.out.println();

for(Animal a : animals) System.out.println(i++ + ” – ” + a);

}

 
 

 
 

// O parâmetro desta função poderá aceitar uma:

// – ArrayList<Dog>

// – ArrayList<Animal>

// – ArrayList<Object>

 
 

// O retorno deve ser estritamente:

// – uma List (comum)

// – uma List<? super Dog>

public static List<? super Dog> doStuff(List<? super Dog> dogs){

dogs.add(new Dog());

 
 

//dogs.add(new Animal());
// não compila – não dá para inserir um Animal em uma lista de Dog

//dogs.add(new Cat());
// não compila – não dá para inserir um Cat em uma lista de Dog

 
 

// Apesar de termos passado como parâmetro para esta função ‘doStuff’ uma ArrayList<Animal>, por razão da Type Erasure o parâmetro dogs será considerado uma simples Lista que apenas aceitará objetos do tipo Dog.

 
 

// Repare que fez-se necessária a conversão explicita para retornar um objeto da lista ‘dogs’ ou seja, o seu tipo é uma simples ArrayList. Veja que se fizermos dogs.getClass() obteremos: class java.util.ArrayList.

Dog d = (Dog)dogs.get(2);

System.out.printf(“(Dog)dogs.get(2) –> houve a conversao explicita %1$s\n”, d);

 
 

return dogs;

}

}

 
 

 
 

javac:

// tivemos esta mensagem pelo retorno em List de doStuff no método main.

Note: Teste.java uses unchecked or unsafe operations.

Note: Recompile with -Xlint:unchecked for details.

 
 

 
 

Output:

// imprimindo a lista ‘lst’ retornada pelo método doStuff.

(Dog)dogs.get(2) –> houve a conversao explicita Dog@19b49e6

0 – Dog@10d448

1 – Cat@e0e1c6

2 – Dog@19b49e6

3 – Animal@6ca1c

4 – 444

 
 

// imprimindo a lista ‘animals’

0 – Dog@10d448

1 – Cat@e0e1c6

2 – Dog@19b49e6

3 – Animal@6ca1c

Exception in thread “main” java.lang.ClassCastException: java.lang.Integer cannot be cast to Animal

at Teste.main(Teste.java:27)

 
 

 
 

 
 

OUTRO EXEMPLO

 
 

 
 

import java.util.List;

import java.util.ArrayList;

 
 

 
 

class A{

A doStuff(){return new A();}

}

class B extends A {

B doStuff(){return new B();}

}

 
 

 
 

public class Teste {

public static void main(String[] args) {

List<? super B> lst = new ArrayList<A>();

lst.add(new B());

lst.add(new B());

// lst.add(new A());
// erro de compilação

lst.add(new B());

print(lst);

 
 

lst = new ArrayList<B>();

lst.add(new B());

lst.add(new B());

print(lst);

 
 

List lst2 = lst; // warning no javac – estamos misturando código genérico com não genérico

lst2.add(new A());

print(lst2);

}

public static void print(List lst){

System.out.println(“\tPRINT…”);

for (Object o: lst) System.out.println(((A)o).doStuff());

}

}

 
 

javac:

Note: Teste.java uses unchecked or unsafe operations.

Note: Recompile with -Xlint:unchecked for details.

 
 

Output:

PRINT…

B@1a758cb

B@1b67f74

B@69b332

PRINT…

B@173a10f

B@530daa

PRINT…

B@a62fc3

B@89ae9e

A@1270b73

 
 

Anúncios
Esta entrada foi publicada em Generics com as etiquetas . ligação permanente.

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão /  Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão /  Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão /  Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão /  Alterar )

Connecting to %s