Warum generische Typ ist nicht anwendbar für das argument reicht super Klasse für beide?
Hier ist das problem, dass ich habe versucht, um die Lösung zu finden.
Wir haben zwei-Klassen-Definitionen. Eins von beiden reicht anderen ein.
class T{}
class TT extends T{}
Voraussetzung ist, dass es sollte eine Liste hält Objekt erstreckt sich T
List<? extends T> list = new ArrayList<>();
Aber das problem tritt auf wenn ich versuche ein TT-Objekt ( kaum scheint, es ist eine Unterklasse von T )
in der Liste aus.
list.add(new TT());
Kompilierung Fehlermeldung
Die Methode add(capture#2-of ? erstreckt sich die Zelle) in der Liste Typ ist nicht anwendbar für die Argumente (Zelle)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie erstellen eine
List<T> list = new ArrayList<T>();
direkt, können alle Subtypen von T in der Liste. Das ist tatsächlich etwas schwierig zu verstehen. wenn Sie deklarieren es alsEs bedeutet, dass es kann damit jeder unbekannte Subtypen von
T
in der Liste. Aber aus dieser Erklärung können wir nicht gewährleisten, die die genaue sub-type-vonT
. also, wir können nur hinzufügennull
hineinList<? extends T>
zeigt an, dass alles kommt aus ihm heraus gewirkt werden kann, um T, also die wahre Liste kann einer der folgenden sein:List<T>
List<T2>
List<TT>
Können Sie sehen, dass auch ein neuer
T
können nicht sicher sein, Hinzugefügt, um so eine Sammlung, da könnte es einList<T2>
dieT
genommen werden können, die in. Als solcher, eine solche Liste kann nicht nicht-null-Einträge Hinzugefügt.In diesem Fall können Sie wollen einfach
List<T>
Also warum würden Sie jemals verwenden diese?!
Diese Kontravarianz kann nützlich sein, für die Parameter der Methode oder gibt, in dem eine Sammlung gelesen werden, anstatt Hinzugefügt. Eine Verwendung für diese werden könnte, um eine Methode zu erstellen, dass nimmt jede Auflistung, die enthält Elemente, T, oder verlängern T.
Diese Methode akzeptieren könne jede Sammlung von Objekten, erweitert Vector3d, so
ArrayList<MyExtendedVector3d>
akzeptabel wäre.Ebenso eine Methode zurückkehren könnte, eine solche Sammlung. Ein Beispiel für ein use-case wird beschrieben in Rückgabe einer Collection<ChildType> eine Methode, die angibt, dass es gibt Sammlung<ParentType>.
List
deren Typ die Argumente sind ein bounded-wildcard? Zum BeispielList<? extends T> list = new ArrayList<? extends T>()
? Ich nehme an, Nein, da bekomme ich einen compiler-Fehler, aber was passiert, wenn der diamond-operator verwendet, wie in OP ' s Beispiel?<>
Es kompiliert, aber eine völlig sinnlose Sache zu tunWenn Sie wollen einfach nur eine
List
wo Sie speichern können Objekte jeder Klasse, die sich vonT
, dann erstellen Sie einfach eineList
wie diese:Den Weg, den Sie erstellt haben, eine Liste aktuell, wird Ihnen nicht erlauben, etwas hinzuzufügen, außer
null
zu.null
?Gibt es Grenze definierten Regeln für Java Generics bei der Verwendung von WildCards
Liste " bedeutet eine Liste von Objekten, die Instanzen der Klasse T oder Unterklassen von T (z.B. TT). Dies bedeutet, dass ein Lesen ist gut , aber einsetzen würde fehlschlagen, da Sie nicht wissen, ob die Klasse Eingegeben wird, um T
Wenn Sie wissen, dass die Liste eingegeben wird, um entweder T oder einer Superklasse von T, ist es sicher, legen Sie Instanzen von T oder Unterklassen von T (e.g.TT ) in der Liste.
In deinem Beispiel sollten Sie "super"