2008-10-21 11 views
5

Nehmen Sie das folgende Beispiel GenerikaWie gehen Sie mit "Super" Generika in Java um?

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

Es funktioniert gut. Aber wie Sie wissen, können Sie es nicht konstruieren mit

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

weil, wie Sie wissen, wird das Add (Tier) würde möglich machen Cat s hinzuzufügen. Die vorgeschlagen Weg, um dieses Problem zu lösen, das heißt von Platzhaltern funktioniert auch nicht, weil, ja, Sie jeden List<Animal> in List<? extends Animal> ändern können, aber es hat das gleiche Problem: Sie können die GenericsTest mit List<Cat> erstellen und dann Dog s hinzufügen.

Also meine Frage ist: Gibt es eine bequeme Möglichkeit, diese Klasse einmal zu schreiben, und dann für alle möglichen Animals verwenden? Natürlich sollte es das oben erwähnte Problem einfach lösen.

Antwort

6

Wenn ich verstehe, was Sie versuchen, was Sie zu tun, dann müssen die Gattung Klassenstufe setzen:

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

Richtig. Mein tatsächlicher Code ist komplexer, weil meine Tiere eigentlich List sind und > scheint nicht zu funktionieren, aber das wäre die nächste Frage (wenn ich nicht selbst herausfinden würde) – Davide

2

Sie möchten die ganze Klasse generische und nicht nur die Parameter machen:

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 {} 
Verwandte Themen