Wildcard (Java)
# Wildcard (Java)

Die Wildcard (selten auch Joker) ? ist in Java ein spezieller aktueller Typparameter für die Instanziierung generischer (parametrisierter) Typen. In diesem Artikel werden die wichtigsten Regeln für seine Verwendung zusammengefasst.

## Kovarianz für generische Typen

Im Gegensatz zu Arrays (die in Java kovariant sind) sind unterschiedliche Instanziierungen eines generischen Typs untereinander nicht (auch nicht explizit) kompatibel: Nach den Vereinbarungen Generisch<Obertyp> oberGenerisch; Generisch<Untertyp> unterGenerisch; meldet der Compiler bei beiden Konvertierungen (castings) (Generisch<Untertyp>)oberGenerisch und (Generisch<Obertyp>)unterGenerisch einen Fehler.

Diese Inkompatibilität kann mit der Wildcard aufgeweicht werden, wenn ? für einen aktuellen Typparameter eingesetzt wird: Generisch<?> ist der abstrakte Obertyp aller Instanziierungen des generischen Typs. Das heißt, von diesem Typ können nur Referenzen, keine Objekte gebildet werden. Der Sinn einer solchen Referenz ist, dass zu ihr beliebige Instanziierungen von Generisch passen.

## Wildcard als Parametertyp

Im Rumpf der generischen Einheit wird der Typparameter wie die obere Schranke (wenn uneingeschränkt, dann wie Object) gehandhabt. Wenn der Ergebnistyp (return type) einer Funktion der Typparameter ist, kann das Ergebnis (z. B. vom Typ ?) in eine Referenz vom Typ der Schranke (Object, wenn keine Schranke) übernommen werden. In die andere Richtung, zum Wildcard-Typ passt kein anderer Typ, nicht einmal Object: Wenn ? für den Typ des formalen Parameters einer Methode eingesetzt wurde, können ihr keine aktuellen Parameter übergeben werden. Sie kann dann nur nach Konvertierung (casting) der Wildcard-Referenz aufgerufen werden:

## Einschränkung der Wildcard

Nicht nur der formale Typparameter, auch die Wildcard kann (weiter) von oben eingeschränkt werden, wenn man nicht beliebige Instanziierungen kompatibel halten möchte:

In diese Referenz kann nun eine Instanz von Generisch eingehängt werden, wo der aktuelle Typparameter ein Untertyp von UntertypVonSchranke ist. In eine Einschränkung von unten

können Instanziierungen von Generisch mit einem beliebigen Obertyp (z. B. Schranke) von UntertypVonSchranke eingehängt werden. Es ist also möglich, dass die zugelassenen Typen von zwei Seiten eingeschränkt werden: von oben durch die Klassenvereinbarung (extends Schranke), von unten durch die Referenzvereinbarung (super UntertypVonSchranke).

## Objekterzeugung mit Wildcard-Instanziierungen

Obwohl von Wildcard-Instanziierungen keine Objekte erzeugt werden können (new Generisch<?> ist also verboten, weil Generisch<?> abstrakt ist), können Array-Objekte nur von uneingeschränkten Wildcard-Instanziierungen (also von keinen anderen generischen Instanziierungen) erzeugt werden: new Generisch<?>[20] ist korrekt, während new Generisch<Schranke>[20] verboten ist.

