Generics: bounded wildcards

223

Mitglied
Hallo

ich lerne gerade die schöne Welt von Generics kennen und löse dazu ein paar Beispielaufgaben.

Nun hab ich folgendes gegeben:
Java:
abstract class Shape {
public abstract void draw();
}
class Circle extends Shape {
public void draw() {};
}
class Rectangle extends Shape {
public void draw() {}
}

eine falsche Implementation davon wäre:
Java:
public void addRectangle (List<? extends Shape> shapes) {
shapes.add (new Rectangle());
}

da shapes ja eine List of Circle sein kann. Soweit so klar. Um dies zu umgehen muss die bounded wildcard spezifischer deklariert werden, wie wir wiefolgt darlegen:
Java:
public void addRectangle (List<? super Rectangle> shapes) {
shapes.add (new Rectangle());
}

es ist nun also typensicher. Aber wieso? super Rectangle ist ja wiederum Shape?
wieso sagen wir nicht:
Java:
public void addRectangle (List<Rectangle> shapes) {
shapes.add (new Rectangle());
}

?


Danke für jeglichen Gedankenanstoss!

grüsse 223
 
Zuletzt bearbeitet von einem Moderator:
hindern tut mich niemand daran, aber ich blick nicht durch wofür es die bounded wildcard <? super [class]> dann überhaupt gibt?
Es scheint das Beispiel ist schlecht.
 
in eine List<Shape> sowie in eine List<Rectangle> kannst du ein Rectangle einfügen,
um Code wie die Methode addRectangle() nicht zu verdoppeln wäre es gut einen Paramerer zu finden, der das leistet,
und List<? super Rectangle> ist der einzige dafür (bedeutet nicht Shape, sondern Rectange, Shape oder gar Object)

was wäre die Alternative? List<Rectangle> geht nicht denn das passt zu List<Shape> nicht,
siehe Beispiele im anderen Thema die dann zu ClassCastExceptions führen
 

Zurück
Oben