Erste Schritte <? super Unterklasse> Return-Typ darf nicht vom Wildcard-Typ sein

enero99

Mitglied
Hallo,
habe gelesen, dass bei <? super ...> der Aufruf von Methoden unmöglich ist, deren Return-Typ vom dem Typ ist, für den das Wildcard steht!

Bei der Methode m1()ist doch der Return-Typ gleich dem Wildcard-Typ?
Habe ich etwas falsch verstanden? Für jede Erklärung dankbar.

Gruß und Dank im Voraus
enero99

Java:
import java.util.ArrayList;
import java.util.List;

public class Gen8 {
   public static void main(String[] args) {
     List<C2> l = new ArrayList<C2>();
     l.add(new C2(4711));
     C2 c = new C2(4712);
     m1(l,c);
   }

   @SuppressWarnings("unchecked")
   static <T extends C1> List<T> m1(List<? super T> list, T t) {
     list.add(t);
     return (List<T>) list;
   }
}

class C1 {
   private int v;
   public C1(int v) {super();this.v = v;}
   int getV() {return v;}
   void setV(int v) {this.v = v;}
   }

class C2 extends C1{
   public C2(int v) {super(v);}};
       
class C3 extends C2{
   public C3(int v) {super(v);}};
 

Flown

Administrator
Mitarbeiter
Kannst du bitte die Frage nochmal verständlich forumlieren und eventuell die Textpassage posten, was dort gemeint wurde?

Dein Codesnippet ergibt so keinen Sinn.
 

Tom299

Bekanntes Mitglied
Irgendwie unnötig, eine Liste und ein Element einer Methode mitzugeben, die einfach nur das Element in die Liste einfügt und die Liste wieder zurückgibt. Da kann man doch gleich das Element selbst in die Liste einfügen. Verstehe den Sinn nicht wirklich.
 

enero99

Mitglied
Hallo,
vielen Dank für die vielen Antworten. Der gepostete Code ist nur ein Beispiel um meine Frage zu verdeutlichen bzw. das mir unverständliche Verhalten aufzuzeigen.

Die Information habe ich aus:
http://www.angelikalanger.com/Articles/JavaMagazin/Generics/GenericsPart1.html
(und dort under 1.5 ziemlich am Ende des Absatzes)
...
Der Zugriff auf ein Objekt, das über eine Referenzvariable vom Typ Wildcard-Instanziierung referenziert wird, ist eingeschränkt. Über eine Variable vom Typ List<? extends Number> beispielsweise dürfen keine Methoden des Typs List aufgerufen werden, die ein Argument vom dem Typ nehmen, für den das Wildcard steht. Hier ist ein Beispiel:

List<? extends Number> list = new LinkedList<Integer>();
list.add(new Integer(25)); // compile-time error

Bei einem Wildcard mit "super" ist der Aufruf von Methoden unmöglich, deren Returntyp vom dem Typ ist, für den das Wildcard steht. Für das "?" Wildcard gelten beide Einschränkungen.

Java:
...
   @SuppressWarnings("unchecked")
   static <T extends C1> List<T> m1(List<? super T> list, T t) {
     list.add(t);
     // hier ist doch der Return-Typ gleich dem Typ für den das Wildcard seht!
     return (List<T>) list; // <<<< das dürfte doch nicht gehen oder?
   }
...
 

stg

Top Contributor
Hier hast du eine Liste, die Objekte vom Typ T (oder davon abgeleitete Objekte) aufnehmen kann. Da kannst du natürlich Problemlos ein Objekt vom Typ T hinzufügen.
Welchen Typ T annimmt, ist zwar erst zur Laufzeit bekannt, aber zur Compile-Zeit ist bereits bekannt, dass du (für die Dauer von einem Methoden-Durchlauf) überall den gleichen Typ T vorliegen hast. Da gibt es keine Probleme.

In deinem anderen Beispiel ist über list-Variable zur Compile-Zeit nur bekannt, dass sie einen Typ, der von Number ableitet, aufnehmen kann. Du weist anschließend zwar explizit eine "Integer-Liste" zu, aber du könntest zwischenzeitlich der Variable list ja auch z.B. eine "BigDecimal"-Liste o.Ä. zuweisen, der du dann natürlich keine Integer-Variable mehr zuweisen kannst.

Der Integer-Liste kannst du also einen Integer hinzufügen, nicht aber der "Irgendwas, was Number erweitert"-Liste. Folgendes würde zum Beispiel gehen:
Java:
List<? extends Number> list = new LinkedList<Integer>() {{
  add(new Integer(25));
  }};

Genauso wie das:
Java:
List<Number> list = new LinkedList<>();
  list.add(new Integer(25));

Im Grunde ist das eigentlich schon das gleiche Problem, welches hier auftaucht:
Das hier geht:
Java:
List<? extends Number> list = new LinkedList<Integer>();
Aber das hier ist verboten:
Java:
List<Number> list = new LinkedList<Integer>();
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
mrStudent <? extends T> und <? super T> Java Basics - Anfänger-Themen 1
Say super.methode / super.variable und super(variable) Java Basics - Anfänger-Themen 2
M Super(); Java Basics - Anfänger-Themen 1
districon Super-Stichwort/ Vererbung Java Basics - Anfänger-Themen 3
N extends und super vs new object Java Basics - Anfänger-Themen 4
CptK Vererbung Attributtyp in Super-Klasse noch nicht festlegen Java Basics - Anfänger-Themen 1
B Warum können super() und this() nicht gemeinsam in einem Konstruktor verwendet werden? Java Basics - Anfänger-Themen 7
Queiser Super boolean Java Basics - Anfänger-Themen 11
E Vererbung super-Methoden Aufruf Java Basics - Anfänger-Themen 3
B super vs. this Java Basics - Anfänger-Themen 24
M Was macht super (...)? Java Basics - Anfänger-Themen 1
E Daten dem Super Aufruf übergeben Java Basics - Anfänger-Themen 3
Henri Aufruf von getX() und getY() aus der Super klasse Objekt() Java Basics - Anfänger-Themen 3
N Frage zu this, super und return Java Basics - Anfänger-Themen 13
E this() / super() Java Basics - Anfänger-Themen 7
T super Java Basics - Anfänger-Themen 3
G funktionen der super-klasse von der super-klasse Java Basics - Anfänger-Themen 6
O Vererbung this innerhalb von super Java Basics - Anfänger-Themen 7
X Frage zu Sub/Super Klassen Java Basics - Anfänger-Themen 7
V Vererbung (wie) kann man eine 'super'-Methode auf ein Objekt anwenden ? Java Basics - Anfänger-Themen 6
E Erste Schritte Lower Bounded Wildcards <? super Integer> Java Basics - Anfänger-Themen 1
K Vererbung (super) Java Basics - Anfänger-Themen 2
C Super und Unterklassen Java Basics - Anfänger-Themen 6
Avarion Getter von Super-Klasse funktioniert nicht Java Basics - Anfänger-Themen 10
I Verständnisfrage zu BridgePattern, Verwedung von super() Java Basics - Anfänger-Themen 4
llabusch Vererbung Super Konstruktor Java Basics - Anfänger-Themen 5
Z Super einfache Frage For-Schleife im Detail Java Basics - Anfänger-Themen 3
vandread Java Wildcards - Wann super wann extends? Java Basics - Anfänger-Themen 2
A Super Klasse Java Basics - Anfänger-Themen 3
O OOP super aufruf 2 objekte? Java Basics - Anfänger-Themen 3
S super() im Konstruktor Java Basics - Anfänger-Themen 12
L Erste Schritte Super Constructor mit Array - Liste? Java Basics - Anfänger-Themen 15
A Shallow copy .super.clone() Java Basics - Anfänger-Themen 2
P Vererbung super() ohne Parameter Java Basics - Anfänger-Themen 2
D Super und Sub-Klassen Java Basics - Anfänger-Themen 2
D super.tostring Java Basics - Anfänger-Themen 8
A Super-Anweisung in abstrakter Klasse Java Basics - Anfänger-Themen 12
K Überschreiben einer "super.super"-Methode Java Basics - Anfänger-Themen 6
Luk10 super() und this Java Basics - Anfänger-Themen 7
S super() aufruf ausgabe Java Basics - Anfänger-Themen 3
L Frage zu Generics: "super" Java Basics - Anfänger-Themen 16
S super.paint() Java Basics - Anfänger-Themen 4
G Vererbung, Konstruktoranweisungen VOR super() Java Basics - Anfänger-Themen 4
G Variablen initialisieren vor super() Java Basics - Anfänger-Themen 8
H Konstruktoren – super! Java Basics - Anfänger-Themen 3
A Am Buch lesen, nun brauch ich eure Hilfe um mir super() zu erklären Java Basics - Anfänger-Themen 4
J Problem mit super Java Basics - Anfänger-Themen 10
G super operator und incompatible types, simple fehler Java Basics - Anfänger-Themen 8
kulturfenster super.paintComponent(g); Java Basics - Anfänger-Themen 3
J abstrakte klasse und methode super Java Basics - Anfänger-Themen 2
B super methode aufrufen und ergänzen? Java Basics - Anfänger-Themen 5
G Innerhalb von Runnable auf super. zugreifen? Java Basics - Anfänger-Themen 3
X this dynamisch, super statisch? Java Basics - Anfänger-Themen 3
A Frage zu super, abstracte Klassen und Kapselung Java Basics - Anfänger-Themen 3
G frage zu vererbung (super) Java Basics - Anfänger-Themen 10
G super(null) Java Basics - Anfänger-Themen 7
F Der "super" Ausdruck Java Basics - Anfänger-Themen 4
S was macht super() ? Java Basics - Anfänger-Themen 7
J Konstruktor der Oberklasse und super Java Basics - Anfänger-Themen 1
W super.methode Java Basics - Anfänger-Themen 2
G neues String Array in super() übergeben Java Basics - Anfänger-Themen 3
I call to super must be first statement in constructor Java Basics - Anfänger-Themen 3
K java syntax: wofür steht super(screen)? Java Basics - Anfänger-Themen 5
S Verwendung von Super Java Basics - Anfänger-Themen 7
P super an methode übergeben Java Basics - Anfänger-Themen 8
S supertyp steht ohne super in hierachy - eclipse Java Basics - Anfänger-Themen 4
U super-Konstruktor Aufrufen mit Object, dass Exception wirft Java Basics - Anfänger-Themen 2
MiMa Java Doc mehrere Return Parameter Java Basics - Anfänger-Themen 11
A Return in While Schleife Java Basics - Anfänger-Themen 6
J Rekursive Funktion und return statement Java Basics - Anfänger-Themen 3
SUPERTJB return Problem Java Basics - Anfänger-Themen 3
M Warum return die Methode den Wert nicht Java Basics - Anfänger-Themen 5
S Methoden Return Rückgabewert wird nicht übergeben Java Basics - Anfänger-Themen 8
schredder Strings und reguläre Ausdrücke - Methode mit return string.matches Java Basics - Anfänger-Themen 5
I Return Array Java Basics - Anfänger-Themen 4
Q return Ausgabe Java Basics - Anfänger-Themen 4
javapingu Variablenwerte ändern ohne return Statement? Java Basics - Anfänger-Themen 7
C Ausgabe boolean return ((n==9)||(n==0)); Java Basics - Anfänger-Themen 13
G return 1 + methode Java Basics - Anfänger-Themen 4
H Methode mit Array als Rückgabe This method must return a result of Type int[] Java Basics - Anfänger-Themen 2
JD_1998 Hilfsmethode if return funktioniert nicht Java Basics - Anfänger-Themen 2
J Missing Return Statement Java Basics - Anfänger-Themen 11
T Return einer anderen Methode herausfinden Java Basics - Anfänger-Themen 9
C ArrayList mit return zurückgeben Java Basics - Anfänger-Themen 13
M kann man return in nur einer Methode einsetzen? Java Basics - Anfänger-Themen 7
V return String[] führt zu [Ljava.lang.String;@50675690 Java Basics - Anfänger-Themen 7
K Return in Schleife Java Basics - Anfänger-Themen 4
B Statische Methode return funktioniert nicht. Java Basics - Anfänger-Themen 19
S Missing return Java Basics - Anfänger-Themen 4
das_leon return message Java Basics - Anfänger-Themen 2
C return kann nicht auf variable zugreifen Java Basics - Anfänger-Themen 26
N Ausführung gibt keinen Fehler an, Return wird aber nicht ausgegeben Java Basics - Anfänger-Themen 22
R return: cannot find symbol Java Basics - Anfänger-Themen 2
R Ratespiel mit Return und einer Eingabe Java Basics - Anfänger-Themen 1
Z Return in While-Schleife Java Basics - Anfänger-Themen 7
K ArrayList ausgeben mit return Java Basics - Anfänger-Themen 6
M Return statement Java Basics - Anfänger-Themen 4
J-Gallus Ein Getter bekommt eine anderen Type als er Return soll Java Basics - Anfänger-Themen 9
J Variablen Komsiche System.in.read() return-value? Java Basics - Anfänger-Themen 3
M Abbrechen Methode ohne return Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben