@Dan Wenn Sie in dieser Frage nach "? Erweitert Objekt" suchen, finden Sie nichts. Ich lese die Antworten durch, um zu sehen, ob ich etwas ableiten kann, aber ich glaube nicht, dass es das ist. Insbesondere geht es nicht um Generika.
Orbfish
@ Dan - Das ist eine andere Frage. Ich habe diese Frage schon einmal gesehen und erinnere mich zumindest an die Erwähnung eines subtilen Unterschieds. Lassen Sie mich sehen, ob ich es finden kann ..
Los geht's: Mögliches Duplikat von Ungebundenen Platzhaltern in Java (mit einer falschen Antwort von Kevin Bourrillion nicht weniger.)
Paul Bellora
Antworten:
103
<?>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.)
Ich bin mir nicht sicher, wie sich das Beispiel bezieht. (da es weder <?> noch <? erweitert Objekt> verwendet)
Orbfish
27
@orbfish: Sie bezieht sich nur dadurch , dass ich dachte , Sie würden es interessant finden, da es ein Beispiel ist , wo 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.
Ruakh
@ruakh - War eher an begrenzten Platzhaltern als an Typparametern interessiert, aber zumindest haben Sie geantwortet.
Orbfish
1
Das hättest du dann in deinem ursprünglichen Beitrag angeben sollen. Auf diese Weise hätte seine Antwort für Sie relevanter sein können.
Liltitus27
19
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 =newArrayList<>();boolean instanceTest = aList instanceofList<?>;
Dies gibt jedoch einen Fehler
List aList =newArrayList<>();boolean instancetest = aList instanceofList<?extendsObject>;
Weitere Informationen finden Sie unter Java-Generika und -Sammlungen von Maurice Naftalin
Wie kann List <?> Überprüfbar sein, wenn der Compiler es in List <Object> übersetzt, um Informationen über den Typ zu erhalten? ist verloren?
Trismegistos
Was ich glaube, <?> Ist eher für die Abwärtskompatibilität mit Legacy-APIs konzipiert. mit <Objekt> und <zu unterscheiden? erweitert Object>, die Post-Java 5-Code sind.
Dennis C
9
<?>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 =newArrayList<Number>();//can accept of type Number
unknownList =newArrayList<Float>();//Float is of type Number
Hinweis:<?> bedeutet alles. Es kann also vom Typ akzeptiert werden, die nicht von der ObjectKlasse geerbt werden .
<?extendsObject>
<? extends Object>bedeutet, dass Sie ein Objekt oder eine Unterklasse übergeben können, die die Klasse erweitert Object.
ArrayList<?extendsNumber> numberList =newArrayList<Number>();//Number of subclass
numberList =newArrayList<Integer>();//Integer extends Number
numberList =newArrayList<Float>();// Float extends Number
T - bezeichnet den Typ
E - bezeichnet das Element
K - Tasten
V - Werte
N - für Zahlen Ref:
"Es kann also vom Typ akzeptiert werden, die nicht von der Objektklasse geerbt werden", aber alle Java-Klassen werden von der ObjectKlasse geerbt oder implizit geerbt .
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 esT
zu einerObject
Löschung führen, während<T extends Foo>
es damit zu einerFoo
Löschung wird. (Dies kann von Bedeutung sein, wenn Sie versuchen, die Kompatibilität mit einer verwendeten vorgenerischen API beizubehaltenObject
.)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:quelle
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
Dies gibt jedoch einen Fehler
Weitere Informationen finden Sie unter Java-Generika und -Sammlungen von Maurice Naftalin
quelle
<?>
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.Hinweis:
<?>
bedeutet alles. Es kann also vom Typ akzeptiert werden, die nicht von derObject
Klasse geerbt werden .<? extends Object>
bedeutet, dass Sie ein Objekt oder eine Unterklasse übergeben können, die die Klasse erweitertObject
.T - bezeichnet den Typ
E - bezeichnet das Element
K - Tasten
V - Werte
N - für Zahlen
Ref:
quelle
Object
Klasse geerbt oder implizit geerbt .