Liste? vs Liste? erweitert Objekt [duplizieren]

8

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?

%Vor%     
Anton Kasianchuk 15.01.2013, 20:47
quelle

4 Antworten

9

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

bedeutet %Vor%

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 .

    
irreputable 15.01.2013 22:07
quelle
1

Beide sind gleich, da alle Objekte in Java Object erweitern. Ich würde List<?> bevorzugen, weil es prägnanter ist.

    
Thomas Jensen 15.01.2013 20:53
quelle
1

Ähnlich wie MyClass extends Object für jede Klasse List<? extends Object> ist das gleiche wie List<?> .

    
Alex DiCarlo 15.01.2013 20:54
quelle
0

Obwohl ich Marko plagiere, für den ich mich entschuldige, ist sein Kommentar die richtige Antwort.

Es gibt keinen Unterschied, weil implizit jeder Typ extends Object .

ist     
Bohemian 15.01.2013 20:55
quelle

Tags und Links