Übergeben von ListSubclass an die Methode, die ListSuperClass erwartet

8

Ich habe eine Methode, die ein List<SuperClass> als Argument erwartet:

%Vor%

Ich möchte diese Methode mit einem List<Subclass> ähnlich wie:

aufrufen %Vor%

Kann ich das nicht tun, wenn SubClass extends SuperClass ?

?     
Derek 16.02.2012, 22:02
quelle

2 Antworten

19

Nein, Generika funktionieren nicht so. Was Sie tun können, ist Ihre Methode als MyMethod(List<? extends SuperClass> list) zu definieren (per Konvention sollte sie myMethod(...) btw heißen).

Das Problem mit List<SuperClass> vs. List<SubClass> ist, dass Sie solchen Listen neue Elemente hinzufügen können, während der Compiler es nicht erlaubt, etwas zu einem List<? extends SuperClass> hinzuzufügen - und das hat einen Grund:

Betrachten Sie Folgendes:

%Vor%

Wenn Sie jetzt ein List<A> haben, können Sie Instanzen von A , B und C hinzufügen. Übergeben Sie jedoch eine List<B> an eine Methode als List<? extends A> -Parameter, weiß der Compiler nicht, ob Instanzen von A oder C zu dieser Liste hinzugefügt werden können (dies wäre nicht zulässig) , aber für den Fall, dass du ein List<A> übergeben würdest, wäre es). Daher beschränkt der Compiler Sie nicht.

Das Definieren eines Parameters als List<A> teilt dem Compiler mit, dass es in Ordnung ist, Instanzen aller drei Klassen in diese Liste aufzunehmen. Wenn Sie jetzt einen List<B> als solchen Parameter übergeben könnten, könnten Sie mit einem List<B> enden, der Instanzen von A und / oder C enthält. Und das ist eindeutig nicht das, was Sie wollen, und könnte zu Laufzeitfehlern führen, die bereits zur Kompilierzeit verhindert werden sollten - durch die Verwendung von Generika. Deshalb funktioniert dein Ansatz nicht.

    
Thomas 16.02.2012, 22:03
quelle
0

Beachten Sie, dass Sie auch die Liste Ihrer superClass aus einer Liste von subClass als solche erstellen können:

%Vor%     
Brant 11.06.2016 20:42
quelle