Generics: Wildcard ?

GetIT

Mitglied
Hi,

Generics sind eine gutes Mittel um dem Compiler Typinformationen zu liefern.
Aber was soll dann der Wildcard <?>?

Dann kann man es doch gleich sein lassen und komplett auf Generics verzichten.
 

mrBrown

Super-Moderator
Mitarbeiter
Ohne Generics ist es ein Raw-Type, und damit werden alle Generics des Objects ignoriert, auch die, die vom Wildcard nicht betroffen sind.

Java:
class GenericsTest<T> {
    public void doSomething(List<String> strings) {
    }
}


GenericsTest<?> wildcard = new GenericsTest<>();
wildcard.doSomething(Arrays.asList(1, 2, 3)); // kompiliert nicht

GenericsTest raw = new GenericsTest<>();
raw.doSomething(Arrays.asList(1, 2, 3)); // kompiliert
 

mihe7

Top Contributor
Noch deutlicher wird das so:
Java:
class GenericsTest {
    public void doSomething1(List p) {}
    public void doSomething2(List<Object> p) {}
    public void doSomething3(List<?> p) {}
}
Bei doSomething1 können beliebige Listen übergeben werden: keine Typsicherheit
Bei doSomething2 können generische Listen, die mit dem Typ Object parametrisiert wurde, übergeben werden. Das bietet zwar Typsicherheit, funktioniert aber nur, wenn die Liste tatsächlich mit Object parametrisiert wurde; ein List<String> kann also nicht verwendet werden.
Bei doSomething3 wird eine Liste, die mit einem beliebigen (auch ohne) Typ parametrisiert wurde, erwartet. Es können z. B. sowohl List, List<Object> als auch List<String> übergeben werden.

Hinzuzufügen wäre noch, dass der Raw-Type, aus Gründen der Kompatibilität mit altem Code, auch im Fall von doSomething2 eingesetzt werden kann - man erhält dann eine entsprechende Warnung.

Hier handelt es sich um eine unbeschränkte Wildcard. Interessant wird es, wenn man diese weiter beschränkt, z. B. nach oben
Java:
    public void doSomething3(List<? extends Runnable> p) {}
In dem Fall führt die Verwendung des Raw-Types ebenfalls zu einer Warnung. Bei generischen Typen können jetzt nur noch solche verwendet werden, deren Parameter von Runnable abgeleitet ist.
 
Zuletzt bearbeitet:

httpdigest

Top Contributor
Weiteres Beispiel:
Java:
public static void addStringToRawList(List list) {
  list.add("Hello"); // <- kompiliert.
}
public static void addStringToWildcardList(List<?> list) {
  list.add("Hello"); // <- kompiliert nicht!
}
Letztere Methode kompiliert nicht, weil eben nicht bekannt ist, dass es sich bei dem konkreten Typ in jedem Call der Methode um eine List<String> handelt. Es kann jeder beliebige Typ sein. Der wichtige Unterschied zu dem Raw-Type ist aber: Es ist ein "bestimmter Typ" und nicht "jeder beliebige Typ".
 

httpdigest

Top Contributor
Es hilft, zu gucken, auf welcher Seite einer potenziellen Zuweisung der `?`-Typ steht. Dann wird es sehr einleuchtend. Die Buchreihe "Effective Java" redet hier zum Beispiel von "consume" vs. "produce" (und wenn wir später bei dem Thema "extends" vs. "super" ankommen, gibt es PECS - "Producer Extends, Consumer Super").
Ist ein generischer Typ ein Konsument oder ein Produzent?
Beispiele für einen Konsumenten sind, wenn der generische Typ auf der linken Seite einer potenziellen Zuweisung steht. So z.B. auch bei List.add(...). Hier findet eine Zuweisung eines aktuellen Argumentes auf den Parameter der generischen List.add(T) Methode statt. Das heißt, das T steht auf der linken Seite einer Zuweisung.
Ein Beispiel für einen Produzenten ist z.B. List.get(int). Ein solcher Ausdruck kann nur auf der rechten Seite einer Zuweisung stehen. Das heißt, das T steht auf der rechten Seite.
Jetzt muss man nur noch in die Erinnerung rufen, was Zuweisungskompatibilität in Java bedeutet. `P = S` bei Referenztypen geht nur dann, wenn `P` entweder derselbe Typ wie `S` oder ein Supertyp von `S` ist.
Und bei `?` kann man nur die Aussage treffen, dass ? von `java.lang.Object` erbt. Mehr geht nicht. Da man aber nicht weiß, welcher konkrete Typ `?` jetzt sein soll, sind Zuweisungen auf `?` nie erlaubt (generischer Typ steht auf linker Seite einer Zuweisung - er ist also Produzent - außer Zuweisungen mit `null`), wohl aber Zuweisungen der Art `Object = ?` (da `?` ja mindestens mal `java.lang.Object` sein muss).
 

mihe7

Top Contributor
warum den den extra Aufwand mit den Generics wenn das keinen Vorteil gegenüber doSomething1(List) bringt?
Richte mal Dein Augenmerk auf die Methoden selbst und nicht auf den Aufruf der Methoden.

In doSomething3 wird mit einer generischen Liste beliebigen aber unbekannten Typs gearbeitet. D. h. Du kannst in der Methode nicht beliebige Objekte zur Liste hinzufügen, da der Typ der Liste nicht bekannt ist. In doSomething1 geht das dagegen schon, da die Liste aus Object-Instanzen besteht.
 
K

kneitzel

Gast
So ganz habe ich das noch nicht verstanden. Außer dass das ? wohl nichts erlaubt.
Ich lese mir aber nicht 352 Seiten durch, um dann festzustellen dass diese keinen Mehrwert für irgendwem hätten.
Du musst ja auch nicht alle Seiten lesen. Aber aus der ersten Antwort würde ich entnehmen, dass zumindest Teilbereiche durchaus einen Wert (gehabt) haben könnten für Dich (Mehrwert benötigt einen Bezug. Mehr bezüglich was?).

Ansonsten gebe ich Dir in so fern Recht, dass es mir auch zu umfangreich beschrieben ist. Ich liebe es auch kürzer und prägnanter, wenn ich mir etwas erarbeite. Da habe ich Dinge lieber ganz kurz umrissen und wenn es nicht reicht, dann nehme ich eine weitere Quelle hinzu. Aber mir ist klar, dass weniger versierte Leute dies nicht so handhaben (können/wollen).
 
X

Xyz1

Gast
Ne Merhwert war vielleicht das falsche Wort. Aber wenn ich Seite um Seite lese und nicht viel Neues dabei lerne, dann ist das für mich nicht so "nützlich". Das meinte ich damit. Und ich weiß auch gar nicht so genau wie man so viel dazu schreiben kann.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Generics Vererbung Wildcard Interface Java Basics - Anfänger-Themen 8
J Generics wildcard Java Basics - Anfänger-Themen 6
H Generics machen mich verrückt Java Basics - Anfänger-Themen 8
John_Sace Homogene Realisierung von Generics in Java ? Java Basics - Anfänger-Themen 19
MarvinsDepression Datentypen Generics: Erste Berührungen Java Basics - Anfänger-Themen 6
M Generics Vererbung Listen Java Basics - Anfänger-Themen 2
Cassy3 Generics - CompareTo Java Basics - Anfänger-Themen 21
T Collections Sind Subklassen-Objekte in Listen mit Generics erlaubt? Java Basics - Anfänger-Themen 16
districon Generics implementieren Java Basics - Anfänger-Themen 2
CptK Überprüfen ob übergebenes Objekt zu Generics passt Java Basics - Anfänger-Themen 2
CptK Generics: Klassen die Interface implementieren, aber selbst nicht das Interface sind Java Basics - Anfänger-Themen 8
B Hilfe bei Generics Java Basics - Anfänger-Themen 11
G Generics Compilerfehler Java Basics - Anfänger-Themen 6
G Generics Methoden Java Basics - Anfänger-Themen 7
G Generics Java Basics - Anfänger-Themen 3
L Generics Tripel Java Basics - Anfänger-Themen 26
W Fragen zu Generics Java Basics - Anfänger-Themen 14
S Hilfe. Generics und BiFunctions Java Basics - Anfänger-Themen 10
X Wie Generics richtig benutzen ? Java Basics - Anfänger-Themen 5
S Allgemeine Frage über Generics und Vererbungen Java Basics - Anfänger-Themen 5
S Generics-Problem: Class, Class<?>, Class<Object> Java Basics - Anfänger-Themen 4
I Java Generics factory method Java Basics - Anfänger-Themen 2
M Verständnisfrage zu Generics Java Basics - Anfänger-Themen 7
I Generics und Comparable Java Basics - Anfänger-Themen 14
G Generics mit ? und Diamantoperator Java Basics - Anfänger-Themen 4
D Generics methode Java Basics - Anfänger-Themen 2
I Frage zu Generics und Wildcards Java Basics - Anfänger-Themen 2
N Generics und Casting eines Objekts Java Basics - Anfänger-Themen 1
A Generics Java Basics - Anfänger-Themen 6
A Vererbung/Interfaces/Generics Java Basics - Anfänger-Themen 12
W Generics - Typ zurückbekommen Java Basics - Anfänger-Themen 4
Dimax Erste Schritte Generics von Profis leicht erklärt Java Basics - Anfänger-Themen 7
C Warum funktioniert 'instanceof' bei generics nicht? Java Basics - Anfänger-Themen 4
J Collections Generics: Typ wird nicht erkannt Java Basics - Anfänger-Themen 7
D Generics ArrayList: Bug im Quellcode Java Basics - Anfänger-Themen 14
C Generics Java Basics - Anfänger-Themen 8
M Generics getter und setter Methoden Java Basics - Anfänger-Themen 4
T Generics in Java... Java Basics - Anfänger-Themen 9
J Generics Java Basics - Anfänger-Themen 3
J Generics Datentypen vergleichen Java Basics - Anfänger-Themen 16
V Generics / eigene Liste Java Basics - Anfänger-Themen 4
O Generics - Implementierung Java Basics - Anfänger-Themen 7
Shizmo Frage zu Generics Java Basics - Anfänger-Themen 3
F Multiple Generics Java Basics - Anfänger-Themen 10
G Datentypen verschiedene Objekte in eine ArrayList, Generics Java Basics - Anfänger-Themen 2
H Typsicherheit/Generics Java Basics - Anfänger-Themen 1
U Java generics funktioniert nicht Java Basics - Anfänger-Themen 0
Tarrew Generics: Erste gemeinse Oberklasse als Rückgabewert Java Basics - Anfänger-Themen 1
S Generics und Comparable Interface Java Basics - Anfänger-Themen 5
A Generics Java Basics - Anfänger-Themen 4
M Frage zu Generics in Klassen, Abstrakten Klassen und Interfaces Java Basics - Anfänger-Themen 5
R Compiler-Fehler Generics Problem Java Basics - Anfänger-Themen 2
K Interface Generics, Interfaces und Listen - ich bin verwirrt. Java Basics - Anfänger-Themen 7
K Generics bei Klassen- und Interfacedeklarationen Java Basics - Anfänger-Themen 3
D toArray und Generics Java Basics - Anfänger-Themen 2
D Zwei Generics beim Überladen von Methoden Java Basics - Anfänger-Themen 3
C Erste Schritte Filter für Generics oder ähnliches Java Basics - Anfänger-Themen 2
M Frage zu Generics-Deklaration Java Basics - Anfänger-Themen 5
S Frage zu Collection-Generics in Subklassen Java Basics - Anfänger-Themen 6
J Java Generics - Frage zu Types Java Basics - Anfänger-Themen 2
M <T> Generics Java Basics - Anfänger-Themen 7
B Interface Generics: prüfen ob Interface deklariert wird Java Basics - Anfänger-Themen 18
T Polymorphie Generics-Problem Java Basics - Anfänger-Themen 2
B Hilfe beim Verständnis zu Generics Java Basics - Anfänger-Themen 7
J Array Generics Java Basics - Anfänger-Themen 3
J Generics casten Java Basics - Anfänger-Themen 14
E Listen und Generics Java Basics - Anfänger-Themen 9
X Generics Java Basics - Anfänger-Themen 6
M Datei einlesen mit generics? Java Basics - Anfänger-Themen 9
D Warum sind Generics mit Vorsicht zu genießen? Java Basics - Anfänger-Themen 6
M OOP Mit Generics auf Methoden zugreifen? Java Basics - Anfänger-Themen 10
S Generics Java Basics - Anfänger-Themen 4
G Generics kein Zugriff auf getter eines Objekts Java Basics - Anfänger-Themen 4
L Datentypen Problem mit Generics und null Java Basics - Anfänger-Themen 6
E Klassen java.util.ArrayList<E> als Generics Java Basics - Anfänger-Themen 16
W Interface Problem mit Generics Java Basics - Anfänger-Themen 2
M OOP Generics und Wildcards Java Basics - Anfänger-Themen 3
D Generics - Warnmeldungen Java Basics - Anfänger-Themen 2
M Polymorphie generics einsteigerprobleme Java Basics - Anfänger-Themen 3
D Vererbung Generics und Vererbung Java Basics - Anfänger-Themen 8
C Generics Array Java Basics - Anfänger-Themen 43
D Fehler mit generics Java Basics - Anfänger-Themen 10
S Generics - CaseInsensitiveMap selber schreiben? Java Basics - Anfänger-Themen 5
K Datentypen Generics Java Basics - Anfänger-Themen 3
P Comparable und Generics Java Basics - Anfänger-Themen 6
I Generics (Subtypen) Java Basics - Anfänger-Themen 17
N Typeinschränkung bei Generics Java Basics - Anfänger-Themen 13
C Generics und Cast Java Basics - Anfänger-Themen 5
H Generics werden in -source 1.2 nicht unterstützt Java Basics - Anfänger-Themen 16
M Datentypen Generics: Exacten Typ ermitteln Java Basics - Anfänger-Themen 6
N Generics und Interfaces Java Basics - Anfänger-Themen 5
S Generics und "generische Feldzuweisungen" Java Basics - Anfänger-Themen 5
lumo Java Generics Java Basics - Anfänger-Themen 19
M verlinkte Liste mit generics Java Basics - Anfänger-Themen 7
capgeti Datentypen Static methoden aus Superklasse mit Generics definieren? Java Basics - Anfänger-Themen 9
S Generics und Typerkennung Java Basics - Anfänger-Themen 7
A Cast ohne Warnung bei Generics Java Basics - Anfänger-Themen 2
B Java Listen und Generics Java Basics - Anfänger-Themen 35
O Abstract Method & Generics Java Basics - Anfänger-Themen 10
K Aufgabe Generics Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben