Wildcard (Java)
Die Wildcard (selten auch Joker) <syntaxhighlight lang="java" inline>?</syntaxhighlight> ist in Java ein spezieller aktueller Typparameter für die Instanziierung generischer (parametrisierter) Typen.<ref>{{#if:|{{#iferror: {{#iferror:{{#invoke:Vorlage:FormatDate|Execute}}|}}| |}}}}{{#if:James Gosling u. a.|James Gosling u. a.: }}{{#if:|{{#if:Chapter 4. Types, Values, and Variables|[{{#invoke:Vorlage:Internetquelle|archivURL|1={{#invoke:URLutil|getNormalized|1={{{archiv-url}}}}}}} {{#invoke:Vorlage:Internetquelle|TitelFormat|titel=Chapter 4. Types, Values, and Variables}}]{{#if:| ({{{format}}})}}{{#if:4.5.1. Type Arguments and Wildcards| 4.5.1. Type Arguments and Wildcards{{#invoke:Vorlage:Internetquelle|Endpunkt|titel=4.5.1. Type Arguments and Wildcards}}}}}}|{{#if:https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.5.1%7C{{#if:{{#invoke:TemplUtl%7Cfaculty%7C}}%7C{{#invoke:Vorlage:Internetquelle%7CTitelFormat%7Ctitel={{#invoke:WLink%7CgetEscapedTitle%7C1=Chapter 4. Types, Values, and Variables}}}}|[{{#invoke:URLutil|getNormalized|1=https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.5.1}} {{#invoke:Vorlage:Internetquelle|TitelFormat|titel={{#invoke:WLink|getEscapedTitle|1=Chapter 4. Types, Values, and Variables}}}}]}}{{#if:| ({{{format}}}{{#if:4.5.1. Type Arguments and WildcardsJava Language Specification2013-02-28{{#if: 2013-01-14 | {{#if:{{#invoke:TemplUtl|faculty|}}||1}}}}
| )
| {{#if:{{#ifeq:en|de||{{#if:en|1}}}}| ;
| )}}}}}}{{#if:4.5.1. Type Arguments and Wildcards| 4.5.1. Type Arguments and Wildcards{{#invoke:Vorlage:Internetquelle|Endpunkt|titel=4.5.1. Type Arguments and Wildcards}}}}}}}}{{#if:https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.5.1%7C{{#if:{{#invoke:URLutil%7CisResourceURL%7C1=https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.5.1}}%7C%7C}}}}{{#if:Chapter 4. Types, Values, and Variables|{{#if:{{#invoke:WLink|isValidLinktext|1=Chapter 4. Types, Values, and Variables|lines=0}}||}}}}{{#if: Java Language Specification| In: {{#invoke:Vorlage:Internetquelle|TitelFormat|titel=Java Language Specification}}}}{{#if: | {{{hrsg}}}{{#if: 2013-02-28|,|{{#if: 2013-01-14 | {{#if:{{#invoke:TemplUtl|faculty|}}||,}}}}}}}}{{#if: 2013-02-28| {{#if:{{#invoke:DateTime|format|2013-02-28|noerror=1}}
|{{#invoke:DateTime|format|2013-02-28|T._Monat JJJJ}}
|{{#invoke:TemplUtl|failure|1=Fehler bei Vorlage:Internetquelle, datum=2013-02-28|class=Zitationswartung}} }}{{#if: |,|{{#if: 2013-01-14 | {{#if:{{#invoke:TemplUtl|faculty|}}||,}}}}}}}}{{#if: | S. {{{seiten}}}{{#if: |,|{{#if: 2013-01-14 | {{#if:{{#invoke:TemplUtl|faculty|}}||,}}}}}}}}{{#if: {{#invoke:TemplUtl|faculty|}}| {{#if:2013-02-28|{{#if:|archiviert|ehemals}}|{{#if:|Archiviert|Ehemals}}}} {{#if:|vom|im}} Vorlage:Referrer{{#if:{{#invoke:TemplUtl|faculty|}}| (nicht mehr online verfügbar)}}{{#if: | am {{#iferror: {{#iferror:{{#invoke:Vorlage:FormatDate|Execute}}|}}|{{{archiv-datum}}}{{#if:2205776||(?)}}}}}}{{#if: 2013-01-14|;}}}}{{#if: 2013-01-14| {{#if:2013-02-28{{#invoke:TemplUtl|faculty|}}|abgerufen|Abgerufen}} {{#switch: {{#invoke:Str|len| {{#invoke:DateTime|format| 2013-01-14 |ISO|noerror=1}} }}
|4=im Jahr
|7=im
|10=am
|#default={{#invoke:TemplUtl|failure|1=Fehler bei Vorlage:Internetquelle, abruf=2013-01-14|class=Zitationswartung}} }} {{#invoke:DateTime|format|2013-01-14|T._Monat JJJJ}}
| {{#invoke:TemplUtl|failure|1=Vorlage:Internetquelle | abruf=2026-MM-TT ist Pflichtparameter}} }}{{#if:{{#ifeq:en|de||{{#if:en|1}}}}|{{#if:4.5.1. Type Arguments and WildcardsJava Language Specification2013-02-28{{#if: 2013-01-14 | {{#if:{{#invoke:TemplUtl|faculty|}}||1}}}}
| (
| {{#if: | | (}}
}}{{#ifeq:{{#if:en|en|de}}|de||
{{#invoke:Multilingual|format|en|slang=!|split=[%s,]+|shift=m|separator=, }}}}{{#if: |{{#ifeq:{{#if:en|en|de}}|de||, }}{{{kommentar}}}}})}}{{#if: 2013-02-28{{#if: 2013-01-14 | {{#if:{{#invoke:TemplUtl|faculty|}}||1}} }}en|{{#if: |: {{
#if:
| „{{
#ifeq: {{#if:{{#if: {{#invoke:templutl|faculty|}}|de-ch|de}}|{{#if: {{#invoke:templutl|faculty|}}|de-ch|de}}|de}} | de
| Vorlage:Str trim
| {{#invoke:Vorlage:lang|flat}}
}}“
| {{#ifeq: {{#if:{{#if: {{#invoke:templutl|faculty|}}|de-ch|de}}|{{#if: {{#invoke:templutl|faculty|}}|de-ch|de}}|de}} | de
| „Vorlage:Str trim“
| {{#invoke:Text|quote
|1={{#if:
| {{#invoke:Vorlage:lang|flat}}
| {{#invoke:Vorlage:lang|flat}} }}
|2={{#if: {{#invoke:TemplUtl|faculty|}}|de-CH|de}}
|3=1}} }}
}}{{#if:
| (<templatestyles src="Person/styles.css" />{{#if: | : }}{{#if: | , deutsch: „“ }})
| {{#if:
| ({{#if: | , deutsch: „“ }})
| {{#if: | (deutsch: „“) }}
}}
}}{{#if: {{{zitat}}}
| {{#if:
| {{#if: {{{zitat}}}
| Vorlage:": Text= und 1= gleichzeitig, bzw. Pipe zu viel }} }}
| Vorlage:": Text= fehlt }}{{#if: | {{#if: {{#invoke:Text|unstrip|{{{ref}}}}}
| Vorlage:": Ungültiger Wert: ref=
| {{{ref}}} }}
}}|.{{#if:{{#invoke:TemplUtl|faculty|}}|{{#if:||{{#ifeq: | JaKeinHinweis |{{#switch:
|0|=Vorlage:Toter Link/Core{{#if: https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.5.1 | {{#if: | [1] }} (Seite {{#switch:|no|0|=|dauerhaft }}nicht mehr abrufbar{{#if: | , festgestellt im {{#invoke:DateTime|format||F Y}} }}. Suche im Internet Archive ){{#if: | {{#if: deadurlausgeblendet | | Vorlage:Toter Link/archivebot }} }} | (Seite {{#switch:|no|0|=|#default=dauerhaft }}nicht mehr abrufbar{{#if: | , festgestellt im {{#invoke:DateTime|format||F Y}} }}.) }}{{#switch: |no|0|= |#default={{#if: || }} }}{{#invoke:TemplatePar|check |opt = inline= url= text= datum= date= archivebot= bot= botlauf= fix-attempted= checked= |cat = Wikipedia:Vorlagenfehler/Vorlage:Toter Link |errNS = 0 |template = Vorlage:Toter Link |format = |preview = 1 }}{{#if: https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.5.1 | {{#if:{{#invoke:URLutil|isWebURL|https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.5.1}} || {{#if: || }} }} | {{#if: | {{#if: || }} | {{#if: || }} }} }}{{#if: | {{#if:{{#invoke:DateTime|format||F Y|noerror=1}} || {{#if: || }} }} }}{{#switch: deadurl |checked|deadurl|= |#default= {{#if: || }} }}|#default= https://wiki-de.moshellshocker.dns64.de/index.php?title=Wikipedia:Defekte_Weblinks&dwl=https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.5.1 Die nachstehende Seite ist {{#switch:|no|0|=|dauerhaft }}nicht mehr abrufbar]{{#if: | , festgestellt im {{#invoke:DateTime|format||F Y}} }}. (Suche im Internet Archive. ) {{#if: | {{#if: deadurlausgeblendet | | Vorlage:Toter Link/archivebot }} }}Vorlage:Toter Link/Core{{#switch: |no|0|= |#default= {{#if: || }} }}{{#invoke:TemplatePar|check |all = inline= url= |opt = datum= date= archivebot= bot= botlauf= fix-attempted= checked= |cat = Wikipedia:Vorlagenfehler/Vorlage:Toter Link |errNS = 0 |template = Vorlage:Toter Link |format = |preview = 1 }}{{#if: https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.5.1 | {{#if:{{#invoke:URLutil|isWebURL|https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.5.1}} || {{#if: || }} }} }}{{#if: | {{#if:{{#invoke:DateTime|format||F Y|noerror=1}} || {{#if: || }} }} }}{{#switch: deadurl |checked|deadurl|= |#default= {{#if: || }} }}[https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.5.1 }}|{{#switch: |0|=Vorlage:Toter Link/Core{{#if: https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.5.1 | {{#if: | [2] }} (Seite {{#switch:|no|0|=|dauerhaft }}nicht mehr abrufbar{{#if: | , festgestellt im {{#invoke:DateTime|format||F Y}} }}. Suche im Internet Archive ){{#if: | {{#if: | | Vorlage:Toter Link/archivebot }} }} | (Seite {{#switch:|no|0|=|#default=dauerhaft }}nicht mehr abrufbar{{#if: | , festgestellt im {{#invoke:DateTime|format||F Y}} }}.) }}{{#switch: |no|0|= |#default={{#if: || }} }}{{#invoke:TemplatePar|check |opt = inline= url= text= datum= date= archivebot= bot= botlauf= fix-attempted= checked= |cat = Wikipedia:Vorlagenfehler/Vorlage:Toter Link |errNS = 0 |template = Vorlage:Toter Link |format = |preview = 1 }}{{#if: https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.5.1 | {{#if:{{#invoke:URLutil|isWebURL|https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.5.1}} || {{#if: || }} }} | {{#if: | {{#if: || }} | {{#if: || }} }} }}{{#if: | {{#if:{{#invoke:DateTime|format||F Y|noerror=1}} || {{#if: || }} }} }}{{#switch: |checked|deadurl|= |#default= {{#if: || }} }}|#default= https://wiki-de.moshellshocker.dns64.de/index.php?title=Wikipedia:Defekte_Weblinks&dwl=https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.5.1 Die nachstehende Seite ist {{#switch:|no|0|=|dauerhaft }}nicht mehr abrufbar]{{#if: | , festgestellt im {{#invoke:DateTime|format||F Y}} }}. (Suche im Internet Archive. ) {{#if: | {{#if: | | Vorlage:Toter Link/archivebot }} }}Vorlage:Toter Link/Core{{#switch: |no|0|= |#default= {{#if: || }} }}{{#invoke:TemplatePar|check |all = inline= url= |opt = datum= date= archivebot= bot= botlauf= fix-attempted= checked= |cat = Wikipedia:Vorlagenfehler/Vorlage:Toter Link |errNS = 0 |template = Vorlage:Toter Link |format = |preview = 1 }}{{#if: https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.5.1 | {{#if:{{#invoke:URLutil|isWebURL|https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.5.1}} || {{#if: || }} }} }}{{#if: | {{#if:{{#invoke:DateTime|format||F Y|noerror=1}} || {{#if: || }} }} }}{{#switch: |checked|deadurl|= |#default= {{#if: || }} }}[https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.5.1 }} }}}}}}}}}}{{#if:| {{#invoke:Vorlage:Internetquelle|archivBot|stamp={{{archiv-bot}}}|text={{#if:|Vorlage:Webarchiv/archiv-bot}}
}}}}{{#invoke:TemplatePar|check |all= url= titel= |opt= autor= hrsg= format= sprache= titelerg= werk= seiten= datum= abruf= zugriff= abruf-verborgen= archiv-url= archiv-datum= archiv-bot= kommentar= zitat= AT= CH= offline= |cat= {{#ifeq: 0 | 0 | Wikipedia:Vorlagenfehler/Vorlage:Internetquelle}} |template= Vorlage:Internetquelle |format=0 |preview=1 }}</ref> 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 <syntaxhighlight lang="java" inline>Generisch<Obertyp> oberGenerisch; Generisch<Untertyp> unterGenerisch;</syntaxhighlight> meldet der Compiler bei beiden Konvertierungen (castings) <syntaxhighlight lang="java" inline>(Generisch<Untertyp>)oberGenerisch</syntaxhighlight> und <syntaxhighlight lang="java" inline>(Generisch<Obertyp>)unterGenerisch</syntaxhighlight> einen Fehler.
Diese Inkompatibilität kann mit der Wildcard aufgeweicht werden, wenn <syntaxhighlight lang="java" inline>?</syntaxhighlight> für einen aktuellen Typparameter eingesetzt wird: <syntaxhighlight lang="java" inline>Generisch<?></syntaxhighlight> 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 <syntaxhighlight lang="java" inline>Generisch</syntaxhighlight> passen.
Wildcard als Parametertyp
Im Rumpf der generischen Einheit wird der Typparameter wie die obere Schranke (wenn uneingeschränkt, dann wie <syntaxhighlight lang="java" inline>Object</syntaxhighlight>) gehandhabt. Wenn der Ergebnistyp (return type) einer Funktion der Typparameter ist, kann das Ergebnis (z. B. vom Typ <syntaxhighlight lang="java" inline>?</syntaxhighlight>) in eine Referenz vom Typ der Schranke (<syntaxhighlight lang="java" inline>Object</syntaxhighlight>, wenn keine Schranke) übernommen werden. In die andere Richtung, zum Wildcard-Typ passt kein anderer Typ, nicht einmal <syntaxhighlight lang="java" inline>Object</syntaxhighlight>: Wenn <syntaxhighlight lang="java" inline>?</syntaxhighlight> 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:
<syntaxhighlight lang="java"> class Generisch<T extends Schranke> {
private T t;
void schreiben(T t) { this.t = t; }
T lesen() { return t; }
} ... Generisch<?> jokerReferenz; Schranke o = jokerReferenz.lesen(); // Object wäre auch OK jokerReferenz.schreiben(new Object()); // Typfehler ((Generisch<Schranke>)jokerReferenz).schreiben(new Schranke()); // OK </syntaxhighlight>
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:
<syntaxhighlight lang="java"> Generisch<? extends UntertypVonSchranke> vonObenEingeschränkteReferenz; </syntaxhighlight>
In diese Referenz kann nun eine Instanz von <syntaxhighlight lang="java" inline>Generisch</syntaxhighlight> eingehängt werden, wo der aktuelle Typparameter ein Untertyp von <syntaxhighlight lang="java" inline>UntertypVonSchranke</syntaxhighlight> ist. In eine Einschränkung von unten
<syntaxhighlight lang="java"> Generisch<? super UntertypVonSchranke> vonUntenEingeschränkteReferenz; </syntaxhighlight>
können Instanziierungen von <syntaxhighlight lang="java" inline>Generisch</syntaxhighlight> mit einem beliebigen Obertyp (z. B. <syntaxhighlight lang="java" inline>Schranke</syntaxhighlight>) von <syntaxhighlight lang="java" inline>UntertypVonSchranke</syntaxhighlight> eingehängt werden. Es ist also möglich, dass die zugelassenen Typen von zwei Seiten eingeschränkt werden: von oben durch die Klassenvereinbarung (<syntaxhighlight lang="java" inline>extends Schranke</syntaxhighlight>), von unten durch die Referenzvereinbarung (<syntaxhighlight lang="java" inline>super UntertypVonSchranke</syntaxhighlight>).
Objekterzeugung mit Wildcard-Instanziierungen
Obwohl von Wildcard-Instanziierungen keine Objekte erzeugt werden können (<syntaxhighlight lang="java" inline>new Generisch<?>()</syntaxhighlight> ist also verboten, weil <syntaxhighlight lang="java" inline>Generisch<?></syntaxhighlight> abstrakt ist), können Array-Objekte nur von uneingeschränkten Wildcard-Instanziierungen (also von keinen anderen generischen Instanziierungen) erzeugt werden: <syntaxhighlight lang="java" inline>new Generisch<?>[20]</syntaxhighlight> ist korrekt, während <syntaxhighlight lang="java" inline>new Generisch<Schranke>[20]</syntaxhighlight> verboten ist.
Literatur
- The Java Language Specification, Third Edition. Sun, ISBN 978-0-321-24678-3
Weblinks
- Generics. Java Tutorials
- Typkompatibilität in Java
Einzelnachweise
<references />
- Wikipedia:Vorlagenfehler/Parameter:URL
- Wikipedia:Vorlagenfehler/Parameter:Linktext
- Wikipedia:Vorlagenfehler/Parameter:Datum
- Wikipedia:Vorlagenfehler/Vorlage:"
- Wikipedia:Weblink offline fix-attempted
- Wikipedia:Vorlagenfehler/Vorlage:Toter Link
- Wikipedia:Vorlagenfehler/Vorlage:Toter Link/URL fehlt
- Java (Programmiersprache)