2014-03-03 23 views
5

Ich habe eine Schnittstelle A wie folgt aus:mit Java Generics

public interface A{ 
    void myFirstMethod(); 
    void mySecondMethod(); 
} 

Und dann habe ich diese Klasse:

public class MyClass{ 
    private List<? extends A> elements; 

    public MyClass(){ 
     A obj = new A(){ 
      @Override 
      public void myFirstMethod(){ 
       //SOME CODE 
      } 
      @Override 
      public void mySecondMethod(){ 
       //SOME CODE 
      } 
     }; 
     elements.add(obj); 
    } 
} 

ich nicht Generika vor (nur Dinge wie List<String>...) verwenden haben, damit ich kann nicht sehen, warum dieser Code nicht kompiliert. Um genau zu sein, bekomme ich einen Fehler in der Zeile elements.add(obj);, dass die Methode hinzufügen für diese Parameter nicht anwendbar ist.

EDIT: Ich habe den Code geändert und jetzt die Elemente.add (Obj) kompiliert gut, aber ich habe ein anderes Problem.

public class MyClass{ 
    private List<A> elements; 

    public MyClass(List<A> elements){ 
     this.elements = elements; 
     elements.add(obj); 
    } 
} 

Wenn ich dies versuche, kompiliert es nicht.

//A1 implements A 
List<A1> list = new ArrayList<A1>(); 
MyClass(list); 

Wie könnte ich das beheben?

Antwort

9

Stellen Sie sich vor, dass Sie zwei Unterklassen haben:

class A1 implements A {...} 
class A2 implements A {...} 

Dann könnten Sie schreiben:

List<? extends A> elements = new ArrayList<A1>(); // a list of A1 

Aber dann sollte dies nicht kompilieren:

elements.add(new A2()); //oops: an A2 is not an A1 

Aus diesem Grund können Sie füge nichts als null zu einem List<? extends A> hinzu, weil du wha nicht weißt t tatsachlicher generischer Typ ist es. Mit anderen Worten bedeutet ? extends A einen spezifischen, aber unbekannten Subtyp von A (oder A selbst).

In Ihrem Fall würde ein List<A> wahrscheinlich tun, was Sie erwarten - Sie könnten einige A1 s und einige A2 s hinzufügen.

+0

Mit anderen Worten: '?' Bedeutet "unbekannt", nicht "any". –

+1

Das ist richtig; Die Schreibweise "Liste " bedeutet, dass es sich um eine "Liste" eines ** spezifischen ** aber ** unbekannten ** Typs handelt. Es bedeutet ** nicht **, dass die Liste eine Mischung verschiedener Objekttypen enthalten kann, die "A" erweitern; es bedeutet, dass die Liste Objekte eines bestimmten Typs enthält, die "A" erweitern, aber Sie wissen nicht, was der tatsächliche Typ ist. – Jesper

+0

@Jesper Ich habe deine Formulierung geklaut, die sehr klar ist ;-) – assylias