Ich habe eine Liste mit generischen Obergrenzen.
%Vor%Ich verstehe das Problem nicht, weil Integer und Double die Nummer erweitern.
List<? extends Number>
bedeutet nicht "eine Liste, die alle Objekte der Unterklassen von Number
enthalten kann", dh "eine Liste, die auf eine konkrete Klasse parametrisiert ist, die Number
erweitert". Es ist nicht der Inhalt der Liste selbst, den Sie definieren, es ist was der parametrisierte Typ des tatsächlichen Listenobjekts ist, das der Variablen zugewiesen wird (Junge, das ist schwerer zu erklären als es zu verstehen :))
So können Sie tun:
%Vor%Wenn Sie eine Liste haben wollen, die in der Lage ist, ein beliebiges Objekt der Klasse Number oder deren Unterklassen zu halten, tun Sie dies einfach:
%Vor%(Das Boxen der eingegebenen Werte ist nicht notwendig, aber für das Beispiel ..)
Obere beschränkte und unbegrenzte Platzhaltersammlungen sind unveränderlich.
Zum Beispiel können Sie nicht:
%Vor% Dies kann nicht kompiliert werden, weil Java nicht weiß, welcher Typ der Liste List<? extends Number>
zur Kompilierungszeit ist.
Im obigen Beispiel könnte myList
zur Kompilierungszeit List<Double>
oder List<Integer>
oder List
einer Unterklasse von Number
sein. Und da Sie Double
nicht zu List<Integer>
hinzufügen können oder umgekehrt, schlägt die Kompilierung fehl.
Weil List<? extends Number>
bedeutet, dass Ihre Variable l
einen Wert vom Typ List
mit konkretes (aber unbekannt!) -Typ-Argument enthält, das Number
erweitert.
Sie können nur null
hinzufügen, weil l
beispielsweise eine List<MyClass>
enthalten kann, wobei MyClass
Ihre Klasse ist, die Number
erweitert, aber auch nicht Integer
oder Double
value Caste an MyClass
.
Ich werde einen weiteren Weg hinzufügen, um die Subtypen von Number
zu dieser Liste hinzuzufügen. d. h.
Dies ist zulässig, da die Liste als unbekannter Supertyp der Klasse Number
parametrisiert ist. Der Compiler erlaubt also den bekannten Subtyp von Number
. d. h. Integer
und Double
types
Ja im Falle von
%Vor%Dies ist nur eine Referenz, möglicherweise ist das eigentliche Objekt
%Vor%, so dass es Ihnen nicht erlaubt sein sollte, Double (5.0) in einer Liste von Integer hinzuzufügen.
Tags und Links java