Wie Generics lernen?

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`?
 
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.
 
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.
 
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!
 
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!
 
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.
 
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?
 
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.
 
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 :)
 
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>`.
 
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:
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.
 
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
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben