Ich habe einige Fragen zu generischen Platzhaltern in Java:
Was ist der Unterschied zwischen
List<? extends T>
undList<? super T>
?Was ist ein begrenzter Platzhalter und was ist ein unbegrenzter Platzhalter?
java
generics
bounded-wildcard
Pablo Fernandez
quelle
quelle
Antworten:
In Ihrer ersten Frage
<? extends T>
und<? super T>
sind Beispiele für begrenzte Platzhalter. Ein unbegrenzter Platzhalter sieht aus<?>
und bedeutet im Grunde<? extends Object>
. Es bedeutet locker, dass das Generikum jeder Typ sein kann. Ein beschränktes Platzhalter (<? extends T>
oder<? super T>
) legt eine Beschränkung des Typs von selbst , dass es entweder hat zu verlängern einen bestimmten Typ (<? extends T>
als eine obere Grenze bezeichnet), oder nur ein Vorfahre eines spezifischen Typs sein (<? super T>
als untere Grenze bezeichnet) .Die Java-Tutorials enthalten einige ziemlich gute Erklärungen zu Generika in den Artikeln Wildcards und More Fun with Wildcards .
quelle
<? super C>
würde bedeuten, dass Ihr Typ auf etwas obenC
in der Typhierarchie beschränkt ist . (Entschuldigung für die extrem späte Antwort. Ich denke, wir hatten vor 2 Jahren keine Kommentarbenachrichtigungen?)Wenn Sie eine Klassenhierarchie A haben, ist B eine Unterklasse von A, und C und D sind beide Unterklasse von B wie unten
Dann
Ein begrenzter Platzhalter entspricht
? extends B
dem Typ B. Das heißt, der Typ ist unbekannt, aber es kann eine "Bindung" darauf platziert werden. In diesem Fall ist es durch eine Klasse begrenzt, die eine Unterklasse von B ist.quelle
List<? super B>
beschreibt als Liste akzeptiert den Typ, der übergeordnete Klasse der Klasse B ist ? Aus diesem Grund kompilieren C und D hmm nicht?Josh Bloch hat auch eine gute Erklärung, wann er sie verwenden soll,
super
undextends
in diesem Google Io-Videogespräch erwähnt er den Produzenten-extends
Konsumentensuper
Mnemonik.Aus den Präsentationsfolien:
quelle
Es kann vorkommen, dass Sie die Arten von Typen einschränken möchten, die an einen Typparameter übergeben werden dürfen. Beispielsweise möchte eine Methode, die mit Zahlen arbeitet, möglicherweise nur Instanzen von Number oder deren Unterklassen akzeptieren. Dafür sind begrenzte Typparameter gedacht.
bedeutet, dass es alle Objekte akzeptieren kann, die eine IS-A- Beziehung zu MyObject haben (dh jedes Objekt, das ein Typ von myObject ist, oder wir können jedes Objekt einer beliebigen Unterklasse von MyObject sagen) oder ein Objekt der MyObject-Klasse.
Beispielsweise:
Dann,
akzeptiert nur MyObject oder untergeordnete Elemente von MyObject (dh Objekte vom Typ OurObject oder YourObject oder MyObject, jedoch keine Objekte der Oberklasse von MyObject).
quelle
Allgemein,
Um Elemente in die Struktur einzufügen, benötigen wir eine andere Art von Platzhalter namens
Wildcards with super
:quelle
Generische Platzhalter werden erstellt, um Methoden, die mit Collection arbeiten, wiederverwendbarer zu machen.
Wenn eine Methode beispielsweise einen Parameter hat
List<A>
, können wir nurList<A>
diese Methode angeben. Unter bestimmten Umständen ist es eine Verschwendung für die Funktion dieser Methode:List<A>
, sollten wir diese Methode angeben dürfenList<A-sub>
. (Weil A-Sub ein A ist)List<A>
, sollten wir diese Methode angeben dürfenList<A-super>
. (Weil A ein A-Super ist)quelle