2008-10-21 15 views
5

Tome el ejemplo siguiente genéricos¿Cómo manejas los "súper" genéricos en java?

import java.util.List; 
import java.util.ArrayList; 

public class GenericsTest { 
    private List<Animal> myList; 

    public static void main(String args[]) { 
     new GenericsTest(new ArrayList<Animal>()).add(new Dog()); 
    } 

    public GenericsTest(List<Animal> list) { 
     myList = list; 
    } 

    public void add(Animal a) { 
     myList.add(a); 
    } 

    public interface Animal {} 
    public static class Dog implements Animal {} 
    public static class Cat implements Animal {} 
} 

Trabaja muy bien. Pero como usted sabe, no se puede construir con

new GenericsTest(new ArrayList<Dog>()); 

porque, como usted sabe, el complemento (Animal) haría posible añadir Cat s. El sugirió forma de resolver este problema, es decir, comodín no funciona bien, porque, sí, se puede cambiar cada List<Animal> en List<? extends Animal> pero tiene el mismo problema: se puede crear el GenericsTest con List<Cat> y luego añadir Dog s.

Así que mi pregunta es: ¿hay una manera conveniente de escribir esta clase una vez, y luego usarla para todos los posibles Animals? Por supuesto, debería resolver directamente el problema mencionado anteriormente.

Respuesta

6

Si entiendo lo que estás tratando de hacer, entonces usted necesita para poner el tipo genérico a nivel de clase:

public class GenericsTest<T extends Animal> 
{ 
    private List<T> myList; 

    public static void main(String args[]) 
    { 
    new GenericsTest<Dog>(new ArrayList<Dog>()); 
    } 

    public GenericsTest(List<T> list) 
    { 
    myList = list; 
    } 

    public void add(T a) 
    { 
    myList.add(a); 
    } 
} 
+0

Derecha. Mi código real es más complejo, porque mis Animales en realidad son List y > no parece funcionar, pero esa sería mi próxima pregunta (si no lo hago por mí mismo) – Davide

2

Es posible que desee hacer que la clase entera genérico en lugar de sólo los parámetros:

import java.util.List; 
import java.util.ArrayList; 

public class GenericsTest<T extends Animal> { 
    private final List<T> myList; 

    public static void main(final String args[]) { 
     new GenericsTest<Animal>(new ArrayList<Animal>()).add(new Dog()); 
     new GenericsTest<Dog>(new ArrayList<Dog>()).add(new Dog()); 
     new GenericsTest<Cat>(new ArrayList<Cat>()).add(new Cat()); 
    } 

    public GenericsTest(final List<T> list) { 
     myList = list; 
    } 

    public void add(final T a) { 
     myList.add(a); 
    } 
} 

// Can't nest as Animal needs to be in scope of class declaration 
interface Animal {} 
class Dog implements Animal {} 
class Cat implements Animal {}