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 Objectnicht redundant ist. Zum Beispiel <T extends Object & Foo>wird es Tzu einer ObjectLöschung führen, während <T extends Foo>es damit zu einer FooLö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.CollectionsKlasse des JDK eine Methode mit dieser Signatur hat:
public static <T extends Object & Comparable<? super T>> T max(
Collection<? extends T> coll
)
extends Objecteigentlich 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 ObjectKlasse 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:
ObjectKlasse geerbt oder implizit geerbt .