2012-04-03 2 views
0

Nehmen wir an, ich habe eine Klasse A, die erweitert werden kann. Innerhalb dieser Klasse A habe ich eine Liste List<A>. Also wird diese Klasse eine Liste mit Elementen A enthalten. Wenn ich nun eine Unterklasse dieser Klasse B extendiere, möchte ich, dass Klasse B dasselbe Element List<B> hat, dh die gleiche Liste, aber diesen Typ mit Elementen vom Typ B. Ist dies mit Generics möglich? ? Ich kann etwas wie A <T extends A> sehen, während ich List<T> deklariere, aber ich mag es nicht, da die Informationen über den Klassentyp schon da sind. Gibt es eine andere bessere Lösung? Beispiel unten:Geben Sie List den gleichen Typ wie die Klasse, die es enthält

public class A { 
    List<A> list = new ArrayList<A>(); 
} 

public class B extends A { 
} 

I Liste will die allgemeine Art von B in der Klasse B.

+2

Es wäre leichter zu verstehen, wenn Sie den Code von A und B geschrieben, anstatt es zu beschreiben. – assylias

+0

erledigt - die Beispiele in der Beschreibung hinzugefügt – user1032285

Antwort

0

Sie können extends Schlüsselwort in generic verwenden haben. Zum Beispiel:

public class A { 

    protected List<? extends A> list; 
    public A() { 
     list = new ArrayList<A>(); 
    } 

    public <T extends A> List<T> getList() { 
     return (List<T>) list; 
    } 
    public void setList(List<A> list) { 
     this.list = list; 
    } 
} 


public class B extends A { 

    public B() { 
     list = new ArrayList<B>(); 
    } 

    public static void main(String[] args) { 
     A a = new A(); 
     a.getList().add(new A()); 

     B b = new B(); 
     b.getList().add(new B()); 
    } 
} 
+0

Wie fügen Sie Element zur Liste hinzu? Wenn Sie '?' Haben, können Sie nur null hinzufügen. –

+0

Ich denke ajozwik hat Recht - Sie können keine Elemente zur Liste hinzufügen – user1032285

+0

@ user1032285, ich aktualisierte Antwort, es ist das gleiche wie Ajozwiks Antwort. –

2

Wenn Sie das Verhalten in der Superklasse setzen wollen, dann werden Sie die Superklasse zu sagen haben, welche Art von Klasse der Unterklasse ist. Dies kann durch Hinzufügen eines generischen Typs zum Super erfolgen.

public class A<E> { 

    protected List<E> items; 

    public A() { 
    this.items = new ArrayList<E>(); 
    } 
} 

public class B extends A<B> { 

    public static void main(String[] args) { 
    B b = new B(); 

    b.items.add(b); 
    } 
} 
+0

So habe ich es jetzt (mit E extend A, um zusätzliche Sicherheit hinzuzufügen) - Ich suchte nach etwas Besserem als Dies – user1032285

Verwandte Themen