Ich denke, der wichtige Teil hier ist die Instanziierung (new ArrayList<Integer>()
), die eindeutig Integer
an die List-Klasse übergibt. Die linke Diamant-Notation ist nicht so wichtig, solange sie kompatibel ist. Da Sie später das generische als obere Grenze von Integer
, hauptsächlich Number
und seine Subtypen definiert haben, ist Java in Ordnung, weil es immer noch mit den Ganzzahlen umgehen kann. Das Objekt ist im Wesentlichen immer noch ein List<Integer>
.
Dies ist wie das Zuweisen einer Zeichenfolge zu einem Objekt. Es funktioniert, weil Object
ein Supertyp von String
ist. Hier ist die List<? extends Number>
eine Art Supertype von List<Integer>
. (Ich weiß, dass das Wort "Supertyp" hier falsch ist, also können Sie mich korrigieren.)
Die Instanziierung mit Generika ist eine Art Instanz der Klasse selbst und eines Objekts. Einige andere Sprachen, z.B. Python verwendet den Begriff "Metaklassen" für diese Art von Verhalten.
See: http://stackoverflow.com/questions/5495383/java-generics-wildcard-question-list-extends-a?rq=1 –
auch: http://stackoverflow.com/a/6439506/2928853 – jrook