Generic Tutorial

cz3kit

Bekanntes Mitglied
Hallo, ich lese mir gerade Generics Tutorial durch. Da gibt es eine Zeile, die mir, hoffe ich mal, klar geworden ist, aber sich die Frage stellt wie man dies Lösen würden.

Die Zeile sieht so aus:
Java:
public void addRectangle(List<? extends Shape> shapes) {
    shapes.add(0, new Rectangle()); // compile-time error!
}

So ich weiß, dass dies nicht zulässig ist, da man nicht weiß, ob das Rectangle-Objekt, dass man zur Liste hinzufügt, von Shape erbt. Wie würde man diese Zeile anders schreiben, also so das es funktioniert?
 

Runtime

Top Contributor
Java:
public void addRectangle(List<Shape> shapes) {
    shapes.add(0, new Rectangle());
}
Geht nur so.
 

cz3kit

Bekanntes Mitglied
Hmm, aber das geht doch iegentlich gar nicht oder? Also laut Tutorial könnte bei solch einer Konstruktion nur ein Shape rein und das wars dann auch schon oder etwa nicht?
 
M

Marcinek

Gast
Wenn es das Rectangel ist, was ich denke, dann erbt es nicht von Shape...

java.lang.Object
extended by java.awt.geom.RectangularShape
extended by java.awt.geom.Rectangle2D
extended by java.awt.Rectangle


Da muss also stehen entweder List<? extends RectangularShape> oder <? extends Rectangle2D> oder <Rectangle>

Edit: Dieses Posting ist natürlich teilweise falsch ^^ es Erbt nicht von Shape aber implementiert Shape und dann gelten die Erklärungen von weiter unten ;)
 
Zuletzt bearbeitet von einem Moderator:

cz3kit

Bekanntes Mitglied
Ah ich habe es mal ausprobiert und das was Runtime geschrieben hat stimmt, es geht so. Ich finde es irgendwie verwirrend, dass wenn man einfahc nur Shape reinschreibt und dann ein Rextangle hinzufügt, das es geht und wenn man das mit einem Wildcard und extends macht, dann nicht.
 

Marco13

Top Contributor
In ein List<Shape> kann man jedes beliebige Shape reinlegen. Nirgendwo gibt es jemanden, der etwas anderes in dieser List vermutet, als ein Shape. Und rein Rectangle IST ein shape.

Bei
addRectangle(List<? extends Shape> shapes) {
könnte die List, die dort übergeben wird, in Wirklichkeit eine
List<Polygon> shapes
sein. (Das IST ja eine List mit irgendwas, was "Shape" extendet). Und wenn da auf einmal ein Rectangle drin liegen würde, würde es krachen...
 

Landei

Top Contributor
Das ist überhaupt nicht verwirrend: List<Shape> ist eine Liste von Shapes, deshalb darf ich ein Rechteck (das ja ein Shape ist) reinpacken.

List<? extends Shape> ist eine Liste von irgendwas, das von Shape erbt, sagen wir mal Siebzehnecke. Käme sich darin dein Rechteck nicht irgendwie unpassend vor? Aus genau diesem Grund ist es verboten, etwas in diese Liste reinzupacken: Wir kennen den genauen Typ der Liste nicht. Beim Rausholen wissen wir, das wir in jedem Fall zumindest ein Shape zurückbekommen (sei es nun ein Siebzehneck oder ein Kreis oder ein Rechteck), deshalb ist Auslesen auch erlaubt.
 

cz3kit

Bekanntes Mitglied
Jau, cool danke für die Erklärungen, damit wäre auch die verwirrung beseitigt. Mich interessiert aber irgendwie noch eine Sache.

Man kann ja folgendes schreiben:
Java:
List<? extends Number> extNumberListe = new ArrayList<Integer>();

Warum schreibt man dann später noch das ArrayList<Integer>();, obwohl man keine Integer reinpacken darf?
 

Landei

Top Contributor
Es gibt einen Unterschied zwischen dem Typ, den ein Objekt tatsächlich hat ("Laufzeittyp") und dem Typ der Variablen, die ja nur eine Referenz auf das Objekt darstellt ("Compilezeit-Typ"). Das ist jetzt nichts speziell generic-typisches:

Java:
Serializable d = new Date();

Links steht hier nur ein Interface, eine Abstraktion. Es gibt kein "Serializable an sich", nur Objekte, die sich an den entsprechenden Typkontrakt halten. Deshalb kann man nicht schreiben:

Java:
//FALSCH
Date d = new Serializable();

Genauso ist List<? extends Shape> eine Abstraktion. Manche Objekte mögen in diese Kategorie hineinpassen, wie etwa eine ArrayList<Shape> oder eine LinkedList<Siebzehneck>, aber es gibt keine Instanzen davon, und deshalb darf es (genausowenig wie Serializable) auf die rechte Seite. Was auf der rechten Seite stehen muss, ist eine konkret zu realisierendes Objekt: Deshalb darf da z.B. auch nicht einfach List stehen, man muss sich eine konkrete Implementierung (wie ArrayList) aussuchen.
 
Zuletzt bearbeitet:

cz3kit

Bekanntes Mitglied
Hmm irgendwie wird mir das nicht klar.

Java:
List<? extends Integer> l = new ArrayList<Integer>();
l.add(new Integer(42));

Ich habe diese Zeilen. Was kann ich denn jetzt für ein Typ in die Liste reinpacken, ohne das es Probleme gibt? Also was da jetzt steht, gibt einen Fehler.

Edit:
Uii, wenn ich das jetzt richtig verstanden habe, verwendet man diese Konstruktion nur, wenn man Objekt aus einer Liste sich holt? Ist das so korrekt? Und man fügt keine hinzu, dann man nicht richtig weiß, was da überhaupt drinne ist?
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Edit:
Uii, wenn ich das jetzt richtig verstanden habe, verwendet man diese Konstruktion nur, wenn man Objekt aus einer Liste sich holt? Ist das so korrekt? Und man fügt keine hinzu, dann man nicht richtig weiß, was da überhaupt drinne ist?

Im Grunde ja. Man kann das verwenden, um "großzügiger" zu sein in bezug auf das, was man akzeptiert. Eine Methode wie
Java:
void maleAlleShapes(List<Shape> shapes) { ... }
würde man eben eher als
Java:
void maleAlleShapes(List<? extends Shape> shapes) { ... }
schreiben, weil man (erstens sowieso nichts da rein legt und zweitens) dort dann auch direkt eine List<Rectangle> übergeben kann, ohne dass er motzt.
 

andiv

Bekanntes Mitglied
Effective Java Item 28:
PECS stands for producer-extends, consumer-super

D.h. wenn du Elemente aus der Collection rausholen willst, dann verwendest du List<? extends Shape> und kannst dir jederzeit ein Shape da rausholen.
Wenn du aber Elemente hinzufügen willst, dann verwendest du List<? super Shape> und kannst jederzeit ein Shape hinzufügen
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
wolei Java generic interface in a generic class Java Basics - Anfänger-Themen 6
L Datentypen Deklarierte Felder einer Generic Klasse bestimmen Java Basics - Anfänger-Themen 7
O Comparable Generic Java Basics - Anfänger-Themen 24
F Type safety: A generic array of.. Fehler Java Basics - Anfänger-Themen 3
Yjuq Generic Methode - Wie muss die List Definition aussehen? Java Basics - Anfänger-Themen 3
S Gibt es für die Klasse HashMap Generic Implementierungen? Java Basics - Anfänger-Themen 11
C Generic im Konstruktor Java Basics - Anfänger-Themen 1
O Generic - Verstädnisproblem Java Basics - Anfänger-Themen 5
G instanceof in Generic Java Basics - Anfänger-Themen 7
N Datentypen LocalDate Generic Comparable Java Basics - Anfänger-Themen 2
P Variablen generic type variablen in object array Java Basics - Anfänger-Themen 1
M Generic Prüfungsvorbereitung Java Basics - Anfänger-Themen 4
G Generic und Listen Java Basics - Anfänger-Themen 8
J Generic - Autoboxing Java Basics - Anfänger-Themen 18
N Generic clonen => eclipse empfiehlt @SuppressWarnings("unchecked") Java Basics - Anfänger-Themen 2
S Generic Java Basics - Anfänger-Themen 9
P Java Generic Wildcard Java Basics - Anfänger-Themen 2
G Namen der Generic Klasse Java Basics - Anfänger-Themen 3
D generic extendet class Java Basics - Anfänger-Themen 10
M Generic's und Vererbung Java Basics - Anfänger-Themen 6
B Generic? Enum - So lösbar? Java Basics - Anfänger-Themen 8
capgeti Datentypen Static generic return value von Subclass? Java Basics - Anfänger-Themen 9
T Generic vom Generic: Zu sehr verschachtelt? Java Basics - Anfänger-Themen 6
V libssrckdtree-j Generic k-d tree Java library - weiss nicht wo des hin soll Java Basics - Anfänger-Themen 2
L Sinn hinter Generic? Java Basics - Anfänger-Themen 5
0 Was bedeutet dieser Generic-code? Java Basics - Anfänger-Themen 3
A Generic Problem Java Basics - Anfänger-Themen 16
S Generic Methode: syntax klemmt Java Basics - Anfänger-Themen 10
S Generic: Verständnisfrage Java Basics - Anfänger-Themen 2
S generic programmierung "ne:w T[X]" Java Basics - Anfänger-Themen 2
G generic interface problem Java Basics - Anfänger-Themen 12
Safado generic array creation Java Basics - Anfänger-Themen 2
G Frage zur Generic java ? Java Basics - Anfänger-Themen 9
G eine Frage zur Generic Java ? Java Basics - Anfänger-Themen 8
LimDul Suche Java Stream Tutorial Java Basics - Anfänger-Themen 2
A Java Kurs / Tutorial Java Basics - Anfänger-Themen 6
nonickatall Erste Schritte Events Dokumentation/Tutorial Java Basics - Anfänger-Themen 1
IamArctic Quaxli Tutorial, Rotorblätter bewegen sich nicht mehr Java Basics - Anfänger-Themen 4
S Suche aktuelles 2D Grafik Tutorial Java Basics - Anfänger-Themen 5
T Gesucht: Tutorial im Anschluß an Gailer-net bzw. Bradley Kjell Java Basics - Anfänger-Themen 0
M Java Anfänger - Video Tutorial Reihe (DEUTSCH) Java Basics - Anfänger-Themen 11
K Gutes Java 3D Game Tutorial gesucht Java Basics - Anfänger-Themen 6
P Java anfänger tutorial gesucht Java Basics - Anfänger-Themen 12
R Quaxli Tutorial - Bild nicht sichtbar Java Basics - Anfänger-Themen 4
Z Problem mit Tutorial - Finde Kon.java nicht Java Basics - Anfänger-Themen 11
S Probleme mit Java 3D Tutorial (Applet) Java Basics - Anfänger-Themen 7
D Tutorial Java Basics - Anfänger-Themen 10
C [Sammelthread] Fragen zu Quaxlis Tutorial Teil 1 Java Basics - Anfänger-Themen 8
C Problem bei Quaxlis Tutorial(Nachtrag Teil1) Java Basics - Anfänger-Themen 9
K Tutorial durch - und dann? Java Basics - Anfänger-Themen 5
8 Tutorial - Java Java Basics - Anfänger-Themen 2
A Suche Java Tutorial (open e-book ö.ä.) Java Basics - Anfänger-Themen 3
P Suche Tutorial für H2 Java Basics - Anfänger-Themen 15
T Java Tutorial auf deutsch Java Basics - Anfänger-Themen 1
N Tutorial Debugger Java Basics - Anfänger-Themen 2
B [Javadoc] Tutorial für die Auswertung des docs Java Basics - Anfänger-Themen 15
S Java Anfänger - Tutorial Frage Java Basics - Anfänger-Themen 10
Hindi93 Hilfe bei Tutorial Java Basics - Anfänger-Themen 10
N Hibernate "Hello World" Tutorial gesucht Java Basics - Anfänger-Themen 9
neurox Tutorial equals und hashCode überschreiben Java Basics - Anfänger-Themen 33
D Java Tutorial zur Netzwerk / Datenbankprogrammierung gesucht Java Basics - Anfänger-Themen 2
D Suche gutes Buch oder Tutorial Java Basics - Anfänger-Themen 3
K java.util.ConcurrentModificationException problem in der Logik? Quaxli-Tutorial Java Basics - Anfänger-Themen 9
S JNA Mapping Tutorial Java Basics - Anfänger-Themen 3
G POI/HSSF tutorial Java Basics - Anfänger-Themen 25
G hibernate . tutorial prob . Java Basics - Anfänger-Themen 4
G Tomcat Tutorial. Java Basics - Anfänger-Themen 8
G TrayIcon für JSF-Applikation -> Tutorial gesucht Java Basics - Anfänger-Themen 4
G Zugriff auf Webservice -> Tutorial gesucht Java Basics - Anfänger-Themen 2
G jfreechart einbinden + tutorial Java Basics - Anfänger-Themen 2
G J2EE Tutorial . komme nicht weiter Java Basics - Anfänger-Themen 7
K Kennt jemand ein gutes Tutorial für Wertübergabe? Java Basics - Anfänger-Themen 4
A Tutorial Java Servlets Java Basics - Anfänger-Themen 3
G gutes Tutorial rund um WAR-Dateien Java Basics - Anfänger-Themen 4
A Tutorial zur Datenbankanbindung gesucht Java Basics - Anfänger-Themen 2
A Java Applikation Tutorial? Java Basics - Anfänger-Themen 4
G suche tutorial für eclipse pluging javaeditor entwicklung Java Basics - Anfänger-Themen 7
G hibernate tutorial Java Basics - Anfänger-Themen 3
M ClearCase Tutorial bzw. Bücher Java Basics - Anfänger-Themen 4
S Suche Tutorial :) Nicht schlagen Java Basics - Anfänger-Themen 3
K gutes Tutorial? Java Basics - Anfänger-Themen 4
C jdbc Anfänger Tutorial gesucht Java Basics - Anfänger-Themen 19
G MySQL Tutorial Java Basics - Anfänger-Themen 2
M Problem mit Code aus JTable Tutorial Java Basics - Anfänger-Themen 11
R Anfänger-Tutorial Java + Eclipse Java Basics - Anfänger-Themen 4
A IO Programm aus Tutorial funktioniert nicht Java Basics - Anfänger-Themen 8
B Frage zum Tutorial "JTable - Teil 5 - Verändern von Dat Java Basics - Anfänger-Themen 6
J Swing Tutorial gesucht ! Java Basics - Anfänger-Themen 11
L Kompellierungsfehler RMI Tutorial Java Basics - Anfänger-Themen 7
G Tutorial zu MVC gesucht Java Basics - Anfänger-Themen 1
G suche ein tutorial um einen LOGIN einzurichten. Java Basics - Anfänger-Themen 5
K [servcer/Client] Suche Server /Client Tutorial. Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben