2008-10-21 7 views
5

Prenez les médicaments génériques exemple suivantComment gérez-vous les génériques "super" 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 {} 
} 

Il fonctionne très bien. Mais comme vous le savez, vous ne pouvez pas construire avec

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

parce que, comme vous le savez, le module complémentaire (Animal) serait possible d'ajouter Cat s. Le suggéré façon de résoudre ce problème, à savoir wildcarding ne fonctionne pas non plus, parce que, oui, vous pouvez changer tous les List<Animal> en List<? extends Animal>, mais il a le même problème: vous pouvez créer le GenericsTest avec List<Cat> puis ajouter Dog s. Donc, ma question est la suivante: est-il un moyen pratique d'écrire cette classe une fois, puis l'utiliser pour tous les Animals? Bien sûr, il devrait résoudre directement le problème mentionné ci-dessus.

Répondre

6

Si je comprends ce que vous essayez de faire, alors vous devez mettre le type générique au niveau de la classe:

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

Droite. Mon code actuel est plus complexe, parce que mes animaux sont réellement Liste et > ne semble pas fonctionner, mais ce serait la question suivante (si je ne me débrouille pas tout seul) – Davide

2

Vous pouvez faire le plutôt que générique toute la classe seuls les paramètres:

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 {} 
Questions connexes