Warum kann Element keine Obergrenze Generics Liste hinzufügen?

8

Ich habe eine Liste mit generischen Obergrenzen.

%Vor%

Ich verstehe das Problem nicht, weil Integer und Double die Nummer erweitern.

    
user2693979 27.01.2014, 14:15
quelle

5 Antworten

16

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 ..)

    
Tobb 27.01.2014 14:22
quelle
1

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.

    
Test1 Test2 01.12.2017 01:50
quelle
0

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 .

    
Philip Voronov 27.01.2014 14:17
quelle
0

Ich werde einen weiteren Weg hinzufügen, um die Subtypen von Number zu dieser Liste hinzuzufügen. d. h.

%Vor%

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

    
Keerthivasan 27.01.2014 14:30
quelle
0

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.

    
punitusingh 19.05.2014 17:07
quelle

Tags und Links