Ich habe gesehen, dass der Wildcard, der zuvor verwendet wurde, ein Objekt bedeutet - aber kürzlich wurde Folgendes verwendet:
<? extends Object>
Sind diese beiden Verwendungen synonym, da alle Objekte Object erweitern?
Ich habe gesehen, dass der Wildcard, der zuvor verwendet wurde, ein Objekt bedeutet - aber kürzlich wurde Folgendes verwendet:
<? extends Object>
Sind diese beiden Verwendungen synonym, da alle Objekte Object erweitern?
Antworten:
<?>
und <? extends Object>
sind auch, wie man es erwarten würde.
Es gibt einige Fälle mit Generika, in denen dies extends Object
nicht redundant ist. Zum Beispiel <T extends Object & Foo>
wird es T
zu einer Object
Löschung führen, während <T extends Foo>
es damit zu einer Foo
Löschung wird. (Dies kann von Bedeutung sein, wenn Sie versuchen, die Kompatibilität mit einer verwendeten vorgenerischen API beizubehalten Object
.)
Quelle: http://download.oracle.com/javase/tutorial/extra/generics/convert.html ; Es erklärt, warum die java.util.Collections
Klasse des JDK eine Methode mit dieser Signatur hat:
public static <T extends Object & Comparable<? super T>> T max(
Collection<? extends T> coll
)
extends Object
eigentlich ist sinnvoll. Wenn ich mich geirrt habe, entschuldige ich mich. Hoffentlich ist es zumindest für andere Leute von Interesse, die auf Ihre Frage stoßen.
Obwohl <?>
es eine Abkürzung für sein soll <? extend object>
, gibt es einen winzigen Unterschied zwischen den beiden.
<?>
ist reifizierbar, solange <? extend object>
nicht. Der Grund dafür ist, dass es einfacher ist, einen reifizierbaren Typ zu unterscheiden. Alles, was so aussieht <? extends something>
, <T>
ist <Integer>
nicht reif.
Zum Beispiel würde dieser Code funktionieren
List aList = new ArrayList<>();
boolean instanceTest = aList instanceof List<?>;
Dies gibt jedoch einen Fehler
List aList = new ArrayList<>();
boolean instancetest = aList instanceof List<? extends Object>;
Weitere Informationen finden Sie unter Java-Generika und -Sammlungen von Maurice Naftalin
<?>
ist eine Abkürzung für <? extends Object>
. Sie können den unten angegebenen Link für weitere Details lesen.
<?>
"?"
bezeichnet einen unbekannten Typ. Er kann einen beliebigen Typ im Code für darstellen. Verwenden Sie diesen Platzhalter, wenn Sie sich bei Type nicht sicher sind.
ArrayList<?> unknownList = new ArrayList<Number>(); //can accept of type Number
unknownList = new ArrayList<Float>(); //Float is of type Number
Hinweis: <?>
bedeutet alles. Es kann also vom Typ akzeptiert werden, die nicht von der Object
Klasse geerbt werden .
<? extends Object>
<? extends Object>
bedeutet, dass Sie ein Objekt oder eine Unterklasse übergeben können, die die Klasse erweitert Object
.
ArrayList<? extends Number> numberList = new ArrayList<Number>(); //Number of subclass
numberList = new ArrayList<Integer>(); //Integer extends Number
numberList = new ArrayList<Float>(); // Float extends Number
T - bezeichnet den Typ
E - bezeichnet das Element
K - Tasten
V - Werte
N - für Zahlen
Ref:
Object
Klasse geerbt oder implizit geerbt .