Generics:Typverträglichkeit bei <? super Integer>

Steve222

Mitglied
Hallo!

Gegeben sind zwei Listen:

Java:
         List<Number> list14 = null;
         List<? super Integer> list15 = null;  

         //list14 = list15; //  Compilerfehler incompatible types   //Zeile 3

         list15 = list14;  //  Zeile 4,  OK
       
         // <? super Integer> bedeutet:  <Integer> und alle Super-Klassen von <Integer>

Kann mir jemand erklären, warum die Zuweisung in Zeile 4 in Ordnung ist?
Im konkreten Fall könnte da eine Typ-Zuweisung "<Integer> = <Number>" sein,
was, denke ich, nicht passt.

Kann man es so deuten, dass der Compiler großzügig bzw. wohlwollend entscheidet,
weil bei Zuweisung "<? super Integer> = <Number>" könnte auch
Typ-Zuweisung "<Number> = <Number>" sein oder auch
Typ-Zuweisung "<Object> = <Number>"
sein, was ja passt.

Viele Grüße

Steve222
 
Hallo wakoz,

Deine Zuweisung "list14 = list15;" geht nicht weil das die Verträge brechen würde die man an die generischen Typen spezifiziert hat. Du sagst list15 soll eine Liste sein in der Elemente sind die beliebigen Typs, jedoch Superklasse von Integer sein soll.
An diese darfst du nun verschiedene Listen zuweisen wie eine Liste vom Typ Object (#4) oder Number(#5). An eine Number Liste darf aber nur eine Number Liste zugewiesen werden.

Vielleicht hilft dir das weiter.
Java:
List<Number> numberList = null;
List<? super Integer> superList = null;
List<Object> objectList = null;
List<? super Number> superNumberList = null;

objectList = numberList; // compiler fehler #1
//List<Object> = List<Number> nicht erlaubt
//auch wenn in einer object list durchaus Number
//instanzen auftauchen dürfen
numberList = superList; // compiler fehler #2
//List<Number> = List<? super Integer>
//an eine Number Liste dürfen nur Number Listen
//zugewiesen werden, die superList könnte aber
//eine objectList sein
numberList = objectList; // compiler fehler #3
//siehe oben

superList = objectList; // erlaubt #4
//List<? super Integer> = List<Object>
//Object ist super typ von Integer
superList = numberList; // erlaubt #5
//List<? super Integer> = List<Number>
//genau wie Number 

superNumberList = superList; // compiler fehler #6
//superList könnte auch Integer haben
//Integer ist aber kein super typ von Number
superList = superNumberList; // erlaubt #7

greez isaias
 
Hallo wakoz,

Deine Zuweisung "list14 = list15;" geht nicht weil das die Verträge brechen würde die man an die generischen Typen spezifiziert hat. Du sagst list15 soll eine Liste sein in der Elemente sind die beliebigen Typs, jedoch Superklasse von Integer sein soll.
An diese darfst du nun verschiedene Listen zuweisen wie eine Liste vom Typ Object (#4) oder Number(#5). An eine Number Liste darf aber nur eine Number Liste zugewiesen werden.

Vielleicht hilft dir das weiter.
Java:
List<Number> numberList = null;
List<? super Integer> superList = null;
List<Object> objectList = null;
List<? super Number> superNumberList = null;

objectList = numberList; // compiler fehler #1
//List<Object> = List<Number> nicht erlaubt
//auch wenn in einer object list durchaus Number
//instanzen auftauchen dürfen
numberList = superList; // compiler fehler #2
//List<Number> = List<? super Integer>
//an eine Number Liste dürfen nur Number Listen
//zugewiesen werden, die superList könnte aber
//eine objectList sein
numberList = objectList; // compiler fehler #3
//siehe oben

superList = objectList; // erlaubt #4
//List<? super Integer> = List<Object>
//Object ist super typ von Integer
superList = numberList; // erlaubt #5
//List<? super Integer> = List<Number>
//genau wie Number 

superNumberList = superList; // compiler fehler #6
//superList könnte auch Integer haben
//Integer ist aber kein super typ von Number
superList = superNumberList; // erlaubt #7

greez isaias

*gg* nicht meine zuweisung

und dan war die farge: Warum geht list15 = list14; also wie bei dir #5 superList = numberList;

list15 ist zwar von beliebigen Typ aber Rückgabe ist Supertyp Integer, als return type geht nur Number oder Objekt. Die super typen von Integer halt.

list14 ist vom typ Number, welches Teilmenge von Integer ist. Außerdem ist die Zuweisung von Konkreter Liste zu Allgemeiner liste. 15 ist eine Allgemeine liste die alles aufnehmen, aber nur Number und Object zurückgeben kann.


PS: dieser Thread existiert zwei mal http://www.tutorials.de/algorithmen...cs-typvertraeglichkeit-bei-super-integer.html
 
Zuletzt bearbeitet:
Huch gleich doppelt vertan...
falsche Antwort & falscher Adressat :)
Eigentlich wollte ich deine Aussage untermauern, irgendwie hab ich dabie den Fokus verloren...

my bad
 

Neue Beiträge

Zurück