Ich habe festgestellt, dass List<?>
und List<? extends Object>
auf die gleiche Weise agieren. Für mich gibt es keinen Unterschied zwischen ihnen. Wenn ich nicht recht habe, kannst du mir den Unterschied erklären?
Es ist kompliziert ...
Für jede Typvariable T
lautet die Spezifikation Ссылка
Jede Typvariable ... hat eine Grenze. Wenn für eine Typvariable keine Bindung deklariert ist, wird Object angenommen.
Man könnte meinen, dass dies auch für Platzhalter gilt, und ?
sollte nur eine Kurzform für ? extends Object
sein.
Beim Durchsuchen der Spezifikation gibt es jedoch keinerlei Hinweise darauf, dass eine Wildcard eine obere Grenze (oder untere Grenze) haben muss. Das "unbounded" ?
wird konsequent von begrenzten Wildcards behandelt.
Wir könnten aus Subtypregeln schließen, dass List<?>
und List<? extends Object>
Subtypen voneinander sind, d. h. sie sind grundsätzlich vom selben Typ. (Der Abzug hängt davon ab, dass E
in interface List<E>
eine implizite obere Grenze Object
hat; die Regeln erfordern jedoch keine Begrenzungen für Platzhalter)
Trotzdem behandelt die Spezifikation die beiden unterschiedlich. Zum Beispiel Ссылка List<?>
ist ein verifizierbarer Typ , aber List<? extends Object>
ist nicht, was
Ich verstehe jedoch nicht warum. Es scheint völlig in Ordnung zu sein, dass ein Platzhalter eine Obergrenze und eine Untergrenze haben muss, standardmäßig Object
und null type
.
Beide sind gleich, da alle Objekte in Java Object
erweitern. Ich würde List<?>
bevorzugen, weil es prägnanter ist.
Ähnlich wie MyClass extends Object
für jede Klasse List<? extends Object>
ist das gleiche wie List<?>
.