Wildcard

Marc T.

Bekanntes Mitglied
Hallo,

ich verstehe nicht ganz, wann ich Wildcards einsetzen muss und wie sie genau funktionieren.
Also brauchen tuh ich das doch denke ich, wenn ich von einem generischen Typ erben möchte..
...richtig?

Also z.B.

Java:
public interface MyInterface<T> {
    public int getSize();
    .....
}

Java:
public class MyClass<T> implements MyInterface<T> {
    ....
    ....
}

Wieso würde ich hier eine Wildcard brauchen und warum?
 

XHelp

Top Contributor
An den 2 Zeilen Code lässt sich nichts sagen außer: weil es vermutlich so ist :bahnhof:
Versuch mal deine Frage etwas konkreter zu stellen.
 

Marc T.

Bekanntes Mitglied
Die Zeilen oben benutzen die Wildcard ja nicht aber sie sollten es tun.
Zumindest erinnere ich mich, dass im laufe meines Studiums gehört zu
haben, da es ohne Wildcards anscheinend zu Fehlern kommen kann wenn
ich von einem generischen Typ erbe.

Leider weiß ich nicht mehr warum oder weshalb.

Deshalb meine Fragestellung ohne konkreter werden zu können:

Warum braucht man Wildcards?
Wie funktionieren Wildcards?
 

Marc T.

Bekanntes Mitglied

thumbs_if_you_cant_explain_it_simply_you_dont_understand_it_well_enough.jpg
 

Marc T.

Bekanntes Mitglied
Weißt du... es hat einfach nicht jeder die Zeit ewig lange
Artikel zu lesen. Wieso und weshalb brauch niemanden interessieren,
jedenfalls sollte es klar sein, dass jeder selber gut genug ist Seiten
zu finden, wie du sie gefunden hast. Wenn man dann trotzdem
einen Thread eröffnet, sind die Gründe doch offensichtlich.

So viel zum Thema "..., dann denken, dann posten.."

Wenn du nicht antworten willst oder die Antwort nicht kennst,
schreib doch einfach nichts ;)
 

Landei

Top Contributor
Wildcards brauchst du nicht, wenn du generische Typen definierst, sondern nur, wenn du sie verwendest. Damit kennzeichnest du Varianzen.

Angenommen, du hast eine Klasse Tier mit dem Feld Gewicht, und willst eine Methode schreiben, die das Gesamtgewicht einer Ladung Tiere berechnet:

Java:
public int summeGewicht(List<Tier> tiere) {
   int summe = 0;
   for(Tier tier : tiere) summe += tier.gewicht;
   return summe; 
}

Schön und gut, aber jetzt hast du ein Problem, wenn du diese Methode mit einer [c]List<Affe>[/c] aufrufen willst. Selbst wenn
Code:
Affe
eine Unterklasse von
Code:
Tier
ist, ist deshalb eine Liste von Affen keine Unterklasse einer Liste von Tieren. Man kann man sich auch leicht verdeutlichen, warum: Eine Unterklasse muss alles können, was die Oberklasse auch kann, aber es wäre schlecht, wenn man in eine [c]List<Affe>[/c] einen
Code:
Tiger
reinpacken könnte - was aber bei einer [c]List<Tier>[/c] problemlos möglich ist.

Hier kommen die Wildcards ins Spiel, um die gewünschte Varianz (genauer gesagt Kovarianz) auszudrücken:
Java:
public int summeGewicht(List<? extends Tier> tiere) {
   int summe = 0;
   for(Tier tier : tiere) summe += tier.gewicht;
   return summe; 
}

Diese Version kann auch mit einer [c]List<Affe>[/c] aufgerufen werden.

Was genau bedeutet nun
Code:
List<? extends Tier>
? Es bedeutet ganz einfach: Hier kann eine Liste eines Typs kommen, der von Tier abgeleitet ist. Wenn man etwas aus dieser Liste herausholt, kann man nicht genau sagen, welches Tier es ist, aber ein Tier ist es auf jeden Fall. Was nicht geht, ist ein Tier in der Liste zu speichern - wir kennen den genauen Typ der Liste nicht, und können deshalb nicht sicherstellen, dass kein Tiger bei den Affen landet.
 
Zuletzt bearbeitet:

Ähnliche Java Themen


Oben