Wie Generics lernen?

Devanther

Top Contributor
Hallo,

ich wollte fragen, wie ich mir am besten Generics beibringen kann?
Und bitte nicht auf Java ist auch eine Insel verweisen.

Kennt jemand ein gutes Tutorial oder Videos?

Ich hab mir dazu einen Udemy Kurs gekauft, aber da wird das leider nicht so gut erklärt.
Kann mir jemand sagen, wie ich dieses doch schon fortgeschrittene Thema lernen kann`?
 

White_Fox

Top Contributor
Am Besten, man probiert es einfach mal selber aus. Vielleicht programmierst du mal so etwas wie ArrayList oder etwas ähnliches nach...da lernt man am meisten.
 

sascha-sphw

Top Contributor
Generics in Action! Oder was genau meinst Du?

Java:
public interface List<E> extends Collection<E> {
...
}

List<String> stringList = new ArrayList<>();  // E => String
List<Integer> integerList = new ArrayList<>(); // E => Integer

Generics sind, salopp gesagt, nur Platzhalter für einen späteren Typ.
 

Devanther

Top Contributor
List<? extends Number>
Upper Bounded Wildcards

das akzeptiert den Typ Number und alle seine Subklassen?

List<? super Integer>
Lower Bounded Wildcards

das akzeptiert den Typ Integer und alle seine Superklassen?


(List<?> list)
Unbounded Wildcards

das akzeptiert List<Integer>, List<Strings>, List<Double>

ist wohl ein anspruchsvolles Thema!
 

httpdigest

Top Contributor
ist wohl ein anspruchsvolles Thema!
Allerdings!

Ich habe mal für Entwickler bei einem größeren Kunden eine Präsentation zu Java Generics gehalten, die ich hier mal öffentlich stellen kann. Da hab ich gut und gerne 50+ Stunden für Recherche und Ausarbeitung investiert und die Folien enthalten relativ ausführliche Erklärungen und Beispiele mit Motivation, warum es das überhaupt in dieser Form gibt, zu allen wichtigen und weniger wichtigen Aspekten von Java Generics: https://drive.google.com/file/d/1FtpjJYTjv6xOu-MU2BRyLsMlGieB8EqT/view
Das hilft dir vielleicht auch noch weiter.
Ansonsten sind die Tutorials/Seiten von Angelika Langer - wie @JustNobody schon schrieb - absolut zu empfehlen!
 

FantastischMan

Aktives Mitglied
Hallo,

ich wollte fragen, wie ich mir am besten Generics beibringen kann?
Und bitte nicht auf Java ist auch eine Insel verweisen.

Kennt jemand ein gutes Tutorial oder Videos?

Ich hab mir dazu einen Udemy Kurs gekauft, aber da wird das leider nicht so gut erklärt.
Kann mir jemand sagen, wie ich dieses doch schon fortgeschrittene Thema lernen kann`?
udemy hat guten sale für 10 euro, kannst java da strukturiert komplett lernen.
 

Devanther

Top Contributor
Ich habe mir bereits einige Kurse da gekauft.
Aber wirklich gut, ist da kein Kurs, der Generics erklären würde.

Nochmal meine Frage: Ob das oben richtig ist?
 

Devanther

Top Contributor
Warum geht dieser Code nicht? Erklärung bitte?
Code:
void consume(List<? extends Number> consumer) {
consumer.addAll(new ArrayList<Integer>());
}

Das hingegen geht.
Code:
void consume(List<? super Number> consumer) {
consumer.addAll( new ArrayList<Integer>() );
}

Ich komme mit den ganzen Typen durcheinander.
 

mrBrown

Super-Moderator
Mitarbeiter
Warum geht dieser Code nicht? Erklärung bitte?
Code:
void consume(List<? extends Number> consumer) {
consumer.addAll(new ArrayList<Integer>());
}
consumer ist eine Liste von irgendetwas, was Number extend'et, zB List<Double>. Einer List<Double> kannst du natürlich keine Integer hinzufügen :)

Das hingegen geht.
Code:
void consume(List<? super Number> consumer) {
consumer.addAll( new ArrayList<Integer>() );
}

consumer ist eine Liste von irgendwa, was ein super-Typ von Number ist, zB List<Object>, und der kannst du natürlich auch Integer hinzufügen :)
 

httpdigest

Top Contributor
Warum geht dieser Code nicht? Erklärung bitte?
Wildcards sagen nicht "jeder beliebige Typ zu jedem Zeitpunkt" sondern: "es ist ein ganz bestimmter Typ, der aber unbekannt ist."
Somit ist im ersten Beispiel mit `List<? extends Number> consumer` nicht bekannt, ob es sich bei einem konkreten Aufruf nun um eine `List<Integer>` oder `List<BigDecimal>`, oder oder... handelt. Somit kann man auch keine `new ArrayList<Integer>()` "reinstecken". Denn: Der "consumer"-Parameter könnte ja keine Liste von Integern gewesen sein, sondern eventuell eine Liste von BigDecimals oder Doubles.

Im zweiten Beispiel wissen wir zwar den konkreten Typ von `List<? super Number> consumer` nicht, aber wir wissen mit Sicherheit, dass es "höchstens" `Number` ist. Und da jede Number auch immer ein Integer zugewiesen bekommen kann (wegen Subtyping), kann man eben auch ein `ArrayList<Integer>` "reinstecken". Genauso aber auch z.B. gleichzeitig noch ein `ArrayList<Double>`.
 

Devanther

Top Contributor
Und da jede Number auch immer ein Integer zugewiesen bekommen kann (wegen Subtyping), kann man eben auch ein `ArrayList<Integer>` "reinstecken".

Das verstehe ich nicht, ein Integer ist doch keine ArrayList<Integer>.
Das sind doch 2 unterschiedliche Dinge.
Nur weil man einen Integer zuweisen kann, bedeutet es nicht, dass man auch eine ArrayList<Integer> hinzufügen kann.
Das man jeder Number einen Integer hinzufügen kann, kann ich nachvollziehen.

Ohman sehr verwirrend!

consumer ist eine Liste von irgendetwas, was Number extend'et, zB List<Double>. Einer List<Double> kannst du natürlich keine Integer hinzufügen :)

Meinst du einen Integer oder eine ArrayList<Integer>() ?

consumer ist eine Liste von irgendwa, was ein super-Typ von Number ist, zB List<Object>, und der kannst du natürlich auch Integer hinzufügen

Warum ist ein Supertyp von Number, List<Object> ?
Was hat Number mit einer Liste zu tun?
 
Zuletzt bearbeitet:
K

kneitzel

Gast
Das verstehe ich nicht, ein Integer ist doch keine ArrayList<Integer>.
Das sind doch 2 unterschiedliche Dinge.
Nur weil man einen Integer zuweisen kann, bedeutet es nicht, dass man auch eine ArrayList<Integer> hinzufügen kann.
Das man jeder Number einen Integer hinzufügen kann, kann ich nachvollziehen.

Nein, er meinte was anderes:
Wenn Du eine Variable vom Typ Number hast, kannst Du da eine Instanz von Integer rein stecken, denn ein Integer ist eine Number. Ebenso kannst Du da auch ein Double rein stecken, denn auch Double ist eine Number.

Bei dem Reinstecken einer ArrayList<Integer> ging es dann um diese Variable und die Variable ist ja ein List<...> daher kann da auch nur eine List betrachtet werden.

Meinst du einen Integer oder eine ArrayList<Integer>() ?

Er meinen einen Integer. Er betrachtet ja die Frage, was man (nicht) in eine List<Double> stecken kann. Eine List von Double nimmt nur Double Werte an, d.h. alles was mein einfügt, muss ein Double sein. (Ist ein Beziehung!)

Schau es dir an wie Kisten. Du sollst dein Zimmer aufräumen. Deine Mama sagt: Du machst eine Kiste, in der kommt alles rein, was irgendwie Lego ist. (List<? extends Lego>). So eine Kiste hast Du aber nicht. Du hast nur die Kisten:
- Kiste für rote Legosteine
- Kiste für Spielzeug

Welche der Kisten könntest Du für "alles was irgendwie Lego ist" rein tun? Die erste packt ja nur rote Legosteine aber alles was irgendwie Lego ist, passt da nicht rein. Die schwarzen Legosteine z.B. kannst Du in so eine Kiste nicht rein packen.
Aber die Kiste für Spielzeug - da passt alles, was Lego ist, rein.

Warum ist ein Supertyp von Number, List<Object> ?
Was hat Number mit einer Liste zu tun?
Nein, Object ist ein Supertyp von Number (Alle Klassen sind direkt oder indirekt von Object abgeleitet) Er hat das List<? super Number> einfach ausgesprochen: "eine Liste von irgendwas, was ein super-Typ von Number ist" Und bei consumer.addAll(new ArrayList<Integer>()); sagst Du, dass du der List<? super Number> consumer alle Integer Werte eine ArrayList zuweisen willst. Daher ist die Frage hier: Kann man ein Integer (denn das ist der Inhalt einer AraryList<Integer>) zu einer List<? super Number> hinzufügen.
? super Number ist ein konkreter Typ, der eine SuperKlasse von Number ist. Da Integer von Number erbt, ist jede Super Klasse von Number auch eine Super Klasse von Integer.
 

httpdigest

Top Contributor
Eine generische Methode definiert selbst Typparameter.
Wann verwendet man generische Methoden oder Wildcards?
Einfach die deutsche Übersetzung von deiner referenzierten Folie:
Generische Methoden:
- Falls Abhängigkeiten zwischen einem oder mehreren Methodenparametertypen und/oder dem Rückgabetyp existieren
Wildcards:
- in allen anderen Fällen
 
K

kneitzel

Gast
Beispiel: Du suchst zwei Personen: Person A und Person B.

Beides sollen Handwerker sein.

So das unabhängig voneinander ist, kannst du das so angeben. Wäre dann Wildcard.

Dann kommt als A ein Schreiner und B ein Elektriker.

Wenn es aber zusammen hängt, dann bedeutet dies: A und B sollen Handwerker sein, aber genau vom gleichen Handwerk. Dann definierst du das einmal als Generic (T ist ein Handwerker) und A und B sind ein T.

T kann jetzt auch Schreiner oder Elektriker sein, aber wenn A ein Elektriker ist, dann ist B auch ein Elektriker.

Das geht als Parameter so wie hier aber auch als Rückgabe.

Ein Handwerker geht bei Dir rein und dann kommt ein Handwerker raus. Aber wenn ein Elektriker rein geht, dann kommt auch ein Elektriker raus. Wenn du wieder nur „Handwerker“ oder so als Wildcard vorgibst, wäre das nicht klar. Daher wieder das Generic.
Hat der Vergleich etwas geholfen?
 
K

kneitzel

Gast
Dann mache ich noch einen Versuch.

Nehmen wir einfach einmal folgendes Beispiel an:
public void someMethod(List<? extends Säugetier> param1, List<? extends Säugetier> param2);
Bei der Methode habe ich zwei List<? extends Säugetier> - Diese sind aber unabhängig voneinander. Also kann ich da als Param1 eine List<Katze> und als Param2 eine List<Hund> rein geben.

Wenn ich nun habe:
<T extends Säugetier> public void someMethod(List<T> param1, List<T> param2);
dann kann T entweder Katze oder Hund sein. Ich kann da also entweder zwei List<Katze> als Parameter übergeben oder eben zwei List<Hund>. Aber nicht eine List<Hund> und eine List<Katze>.

T ist also EINE beliebige Klasse, die die Anforderungen erfüllt. Aber es kann pro Nutzung eben nur exakt eine Klasse sein.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Klarnamen etc... (von Wie Generics lernen?) Allgemeine Java-Themen 26
J Best Practice Generics mit Enum Allgemeine Java-Themen 3
H Kombination Interface und Abstrakte Klasse bei Generics Allgemeine Java-Themen 3
Zeppi Cast Object in Generics Allgemeine Java-Themen 4
P Generics und Arrays Allgemeine Java-Themen 6
M Generics / Typen Allgemeine Java-Themen 1
Kirby.exe InsertionSort mit Generics Allgemeine Java-Themen 33
Kirby.exe Vererbung bei Generics Allgemeine Java-Themen 7
L Compiler-Fehler Generics beim Anhängen von Predicates Allgemeine Java-Themen 1
W Vererbung Generics - mal wieder die verhaßte Rückwärtskompatibilität Allgemeine Java-Themen 2
S Verstaendnisfrage Generics Allgemeine Java-Themen 19
W Generics + Vererbung Allgemeine Java-Themen 47
I Methoden Generics-Methode Allgemeine Java-Themen 3
D Mit Generics arbeiten - Übungsaufgabe Allgemeine Java-Themen 3
K Factory Pattern: Mit Generics umgehen Allgemeine Java-Themen 6
G Generics Allgemeine Java-Themen 31
perlenfischer1984 Liste mit generics zurück liefern Allgemeine Java-Themen 8
Hacer Generics & Collections Allgemeine Java-Themen 8
Neumi5694 Interface Generics für Enum-Filterung verwenden Allgemeine Java-Themen 5
H Collector Generics Problem (incl. Stream & Lambda) Allgemeine Java-Themen 4
C Gemeinsame Oberklasse zweier Generics Allgemeine Java-Themen 10
erdmann Datentypen Methodendeklaration mit Generics Allgemeine Java-Themen 2
Z Datentypen Verschachtelte Generics Allgemeine Java-Themen 1
Neumi5694 Datentypen Generics Allgemeine Java-Themen 5
S Mit Generics Klasse erstellen die selbst T erweitert..? Allgemeine Java-Themen 4
Tarrew Generics - Type erasure Allgemeine Java-Themen 5
N Problem mit Generics und Interface Allgemeine Java-Themen 4
H Generics als Parameter Allgemeine Java-Themen 1
kaoZ Generics und Vererbung Allgemeine Java-Themen 3
A Datentypen Generics: Wie am besten auf Typparameter zugreifen Allgemeine Java-Themen 2
C Generics Objekt in ArrayList Allgemeine Java-Themen 2
vandread Kleine Generics Aufgabe aus einer Prüfung... wie ist das gemeint? Allgemeine Java-Themen 6
G Generics sind zu streng - oder ich zu naiv? Allgemeine Java-Themen 3
G Verschachtelte Generics Allgemeine Java-Themen 2
O Generics Allgemeine Java-Themen 42
M Problem mit Generics Allgemeine Java-Themen 10
M Generics (bounded wildcards statt Interface Bezeichnern) -- Sinn oder Unsinn? Allgemeine Java-Themen 2
darekkay Generics: Wildcard und Object Allgemeine Java-Themen 5
H Collections Generics und Reflection Allgemeine Java-Themen 6
F Google Guice + Generics + Vererbung Allgemeine Java-Themen 5
H Problem mit Java Generics Allgemeine Java-Themen 6
J Generics: Typparameter als Klasse zurückliefern Allgemeine Java-Themen 4
H Generics Allgemeine Java-Themen 5
P Probleme mit Generics Allgemeine Java-Themen 5
B Generics und primitve arrays Allgemeine Java-Themen 6
M Generics Allgemeine Java-Themen 11
1 Collections Generics, internes Verhalten Allgemeine Java-Themen 16
T Warnungsfreie Verwendung von Generics Allgemeine Java-Themen 11
M Probleme mit Generics Allgemeine Java-Themen 5
D Java Generics Allgemeine Java-Themen 8
2 Generics: bounded wildcards Allgemeine Java-Themen 4
J Generics / vermeiden von downcasts Allgemeine Java-Themen 2
2 Generics oder nicht? Allgemeine Java-Themen 8
E Problem mit Generics und Comparable Allgemeine Java-Themen 16
W Erweitern einer Klasse mit Generics Allgemeine Java-Themen 8
H Generics für Methode Allgemeine Java-Themen 14
N Überladen mit Hilfe von Generics Allgemeine Java-Themen 3
S Generics: Fuer Set<T> ein T-Klassenobjekt erhalten? Allgemeine Java-Themen 3
Q Der innere Typ von Generics? Allgemeine Java-Themen 3
N Generics-NullpointerException Allgemeine Java-Themen 7
2 Generics - Typ Allgemeine Java-Themen 12
P Generics Problem Allgemeine Java-Themen 10
S Type safety Warnings beim casten von Generics Allgemeine Java-Themen 6
N Generics Allgemeine Java-Themen 3
V Frage zu Generics Allgemeine Java-Themen 2
S java generics klassen deklaration Allgemeine Java-Themen 7
B hashtable für unterschiedliche Typen - mit Generics Allgemeine Java-Themen 8
E Generics Allgemeine Java-Themen 3
MQue Generics Allgemeine Java-Themen 4
R Problem mit Reflection und Generics Allgemeine Java-Themen 3
C Klassen, die aufeinander verweisen (mit Generics) Allgemeine Java-Themen 16
G Generics - W.card unter Nutzung von Annotationsklasse? Allgemeine Java-Themen 6
G sortieren von generics Allgemeine Java-Themen 10
G Generics in Map. Type of value abhängig vom key Allgemeine Java-Themen 3
A Generics Verständnisfrage Allgemeine Java-Themen 7
Z Generics funzt nicht? Allgemeine Java-Themen 2
T Generics Allgemeine Java-Themen 18
G ComboBox: Nur eine Art Klasse zulassen (Generics) Allgemeine Java-Themen 3
J Generics Expertenwissen? Allgemeine Java-Themen 5
S Generics-Problem Allgemeine Java-Themen 3
T Generics und Wil-dcards Allgemeine Java-Themen 8
Q Typen von Generics & Casten Allgemeine Java-Themen 3
S Generics Allgemeine Java-Themen 2
R Problem mit Generics Allgemeine Java-Themen 2
G Trotz Generics Cast-Fehler! Allgemeine Java-Themen 5
T TreeMap durch Comparator mit Generics sortieren Allgemeine Java-Themen 9
T Generics und instanceof Allgemeine Java-Themen 10
T Generics und Exceptions Allgemeine Java-Themen 6
M Beliebig viele Typen bei Generics Allgemeine Java-Themen 3
G Reflection objekt mit generics erzeugen Allgemeine Java-Themen 5
S Singleton Pattern mit Generics Allgemeine Java-Themen 4
G Generics und Comparable Allgemeine Java-Themen 11
H Generics Problem Allgemeine Java-Themen 3
F Generics: spricht etwas dagegen raw types zu verwenden? Allgemeine Java-Themen 31
M Generics - besser programmieren, Warnung umgehen Allgemeine Java-Themen 4
E Java, UML, Generics Allgemeine Java-Themen 6
P Array von Vectoren + Generics Allgemeine Java-Themen 6
M ArrayList erweitern - generics Allgemeine Java-Themen 4
E Generics -> UML Allgemeine Java-Themen 4
G Generics: Instanzieren einer Klasse in einer Methode. Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben