generics 9. kapitel -...
TRANSCRIPT
![Page 1: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/1.jpg)
TechnikenderProgrammentwicklung
Prof.Dr.WolfgangSchramm
GENERICS9.Kapitel
![Page 2: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/2.jpg)
1
Übersicht
1. ProgrammstrukturierungmitPaketen(packages)
2. Vererbung3. AbstrakteKlassenundInterfaces4. Ausnahmebehandlung5. Datenströme:dieJavaIO-Bibliothek6. Multithreading7. Collections8. InnereKlassen9. Generics10. Reflection
![Page 3: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/3.jpg)
2
LernzieledesKapitels
¨ Verstehenwarumman(inJava5)Generics eingeführthat.
¨ KennenlernendesGeneric-Konzepts.
¨ Verstehen,wasgenerischseinkann.
¨ SelbstgenerischeKlassenundMethodenschreibenkönnen.
![Page 4: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/4.jpg)
3
Inhalt
1. Einführung/Motivation2. Generics (Definition)3. GenerischeKlassen
• Subtyping• Wildcards
4. GenerischeMethoden5. Anwendungsbeispiele
![Page 5: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/5.jpg)
5
Beispiel:EinfacherStack fürbestimmteObjekte
Stack für Integer-ObjekteStack für String-Objekte
Schlecht: 2 x quasi derselbe Code für dieselben Aufgaben.Frage: Kann man das mit unserem Wissen nicht besser machen?Wenn ja: Wie?
![Page 6: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/6.jpg)
6
Beispiel:EinfacherStack füralleArtenvonObjekten
Laufzeitfehler
![Page 7: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/7.jpg)
7
ADTStack:ProblemTypsicherheit
o DerADTStack istprinzipielloffenfürjedenTyp.o ManspeichertObjektevomallgemeinstenTypObject.o BeimLesenvomStack (pop)werdendieseallgemeinenObjekte
auchwiederzurückgeliefert.o WennmanineinemStack Integer-Objektespeichert,willmandort
keineString-Objektespeichern– dochmiteinenallgemeinenTypObject kanndasnichtverhindertwerden.
o AbhilfeseitJava5:dieNutzungvonGenericsà bessereTypsicherheit,dennnurganzspezielleObjektekommenindieDatenstruktur.
o MitdenGenerics lässtsichbeiderKonstruktiondesADTStackangeben,welcheObjekteindenStack aufgenommenwerdendürfen.
o Dannistmanauchsicher,welcheObjektemanvomStack zurückbekommt.
![Page 8: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/8.jpg)
8
Motivation
o WieabstrahiereichvomkonkretenTypeinesObjekts?o Wiekannich(typsichere)Containerklassen(z.B.einenADT
Stack)bauen,diejedesbeliebigeObjektaufnehmenkönnen?o WiebaueichtypsichereFrameworks?o Wievermeideich(unsichere)Casts undmachedadurch
meinenCodetypsicher?
![Page 9: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/9.jpg)
9
Beispiel:Stack mitGenerics
![Page 10: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/10.jpg)
10
Beispiel:Stack mitGenerics
Compilezeitfehler
![Page 11: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/11.jpg)
11
GenerischeTypen– Warum?
o BeidenerstengetyptenProgrammiersprachen(z.B.Pascal):⇒ ProgrammierermusstedieselbeDatenstrukturfürjeden
Datentyp,derunterstütztwurde,definieren.⇒ EineListevonZahlen,eineListevonZeichenundeineListe
vonDatumsangabenwird(imGrunde)aufdieselbeWeiseprogrammiert.DieAlgorithmenzumEinfügen,SuchenundLöschenlaufenstetsgleichab.
¨ Wünschenswert:dieImplementierungderListeunabhängigvondiesenTypenvorzunehmen.
o ErsterVerbesserungsansatzinJavadurchVererbungsbeziehung⇒ Zielnurteilweiseerreichtà keineUnterstützungbezüglich
derTypüberprüfungenzurCompilezeit.
![Page 12: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/12.jpg)
12
GenerischeTypeninJava
o EingenerischerTypà ErzeugungvonDatentypen,dievondenzuGrundeliegendenTypenabstrahieren.
o CharakteristischfürgenerischenProgrammierungà dieAlgorithmenwerdennichtfüreinenbestimmtenDatentypgeschrieben.SiestellennurbestimmteAnforderungenandieTypen.
o GenerischeTypen inderInformatik:DatentypenmitderMöglichkeitzurAngabevonTypparametern.
![Page 13: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/13.jpg)
13
GenerischeProgrammierung– Wasistdas?
o InC++:Templates,inJava:Generics.o DerBegriffstehtsynonymfür„parametrisierteTypen“.o Idee:EswerdenzusätzlicheVariablenfürTypen,sogenannte
Typ-Variableneingeführt.o DieseTyp-VariablenrepräsentierenzumZeitpunktder
ImplementierungunbekannteTypen.o ErstbeiderVerwendungderKlassen,Schnittstellenund
MethodenwerdendieseTyp-VariablendurchkonkreteTypenersetzt.
o DamitkanntypsichereProgrammierunggewährleistetwerden.
![Page 14: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/14.jpg)
14
Generics – wiefunktionierensie?
Fehlermeldung zur Compilezeit!
Aktueller Typparameter
Kein Cast mehr nötig!
The method push(String) in the type GenericSimpleStack<String> isnot applicable for the arguments (int)
![Page 15: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/15.jpg)
15
Generics:Eigenschaften
o GenerischeTypenerlaubenvomkonkretenTypzuabstrahieren.¤ mitderMöglichkeitzurAngabevonTypparametern,d.h.Typeiner
Variable,einesParameters,einesRückgabewertesetc.istselbereinVariable(typevariable).
¤ KlassenundMethodenhaben,quasialsSchablone,einenzusätzlichenTyp-Parameter(typeparameter),diesesetzendanndieTypvariablen.
¤ DerProgrammierersetztdieTyp-Parameter,sowieeresbrauchtundparametriertdamitdieKlassenbzw.Methoden.
¤ KlassenmitTyp-Parameternà generischeTypen(generic types)bzw.generischeKlassen(generic classes)
¤ MethodenmitTyp-Parameternà generischeMethoden(genericmethods)
Þ TypprüfungbereitszurCompilezeità Typsicherheit.Þ VerbessertLesbarkeitundRobustheitderProgramme.Þ (Entfernte)ÄhnlichkeitenzuTemplatesinC++
15
![Page 16: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/16.jpg)
16
Generics Definition
¨ DefinitionvonTypparametern:inspitzenKlammernhinterdemKlassen-oderInterfacenamen.
¨ TypparameterinnerhalbderKlassebzw.desInterfacesverwendbarwieeinTyp.
¨ Typparameter:keineelementarenDatentypen,nurUnterklassenvonObject zulässig.
¨ EmpfehlungfürNamenskonvention¤ Großbuchstabe¤ EinContainerklassen
Formaler Typparameter
Verwendung des Typparameters bei AttributenVerwendung
des Typ-parameters in Methoden
![Page 17: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/17.jpg)
17
Generics – BegriffeundBeispiele
Name Beispiel
Generischer Typ (generic type) List<E>
Formaler Typ-Parameter (formal type parameter) E
Parametrisierter Typ (parametrized type) List<String>
Aktueller Typ-Parameter (actual type parameter) String
Ungebundener Wildcard-Typ (unbounded wildcard type) List<?>
Raw Type List
Gebundener Typ-Parameter (bounded type parameter) <E extends Number>
Rekursiv gebundener Typ-Parameter (recursive bounded type) <E extends Comparable<E>>
Gebundener Wildcard-Typ (bounded wildcard type) List<? extends Number>
Generische Methode (generic method) static <E> List<E> asList(E[] a)
Type Token String.class
![Page 18: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/18.jpg)
18
Generics – RealisierunginJava
o Generics sindeinCompile-Zeit-Konstrukt,d.h.dieGenericsexistierennurzurCompile-Zeit.
o DieTyp-InformationendesgenerischenTypswerdenvomCompilerentfernt(Typlöschung/typeerasure).¤ Typ-ParameteristzurLaufzeitvomTypObject.¤ Typ-ParameterkannnichtinstatischenVariablenoderMethodenverwendet
werden.¤ Typ-Parameterkannnichtverwendetwerden,umObjektezuerzeugen.
o EsgibtzurLaufzeitnureineeinzige KlasseprogenerischemTyp(Raw type)– sog.homogeneÜbersetzung.
o InC++wirdfürjede AusprägungeinesTemplatesderCodefüreineKlassebzw.Funktiongeneriertundcompiliert;esgibtalsoprogenerischemTypinC++eineKlasse– sog.heterogeneÜbersetzung.
![Page 19: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/19.jpg)
19
Raw-TypeeinergenerischenKlasse
GenerischeKlassemitTypvariablen. VomCompilerausdergenerischenKlassegeneriertersog.Raw-Type.
Compilezeitkonstrukt Laufzeitkonstrukt
![Page 20: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/20.jpg)
20
Typ-VariablenundparametrisierteTypen-Kompatibilität
Gegeben:class C<E> { … }
class A { … }
class B extends A { … }
DanngeltendenfolgendeKompatibilitätsbedingungen:C<A> # C<B> VererbungsbeziehungkannnichtaufgenerischeTypenübertragen
werden.
C<B> # C<A>
C<Object> # C<A>
C<Object> # C<B>
C ¬ C<A> Derraw-TypeistmitjedemgenerischenTypkompatibel
C ¬ C<B>
Object ¬ E
E # Object
Legende:¬ kompatibel# nicht kompatibel
Erklärung: s.u.
![Page 21: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/21.jpg)
21
ParametrisierteTypen:parametrisierterTypalsaktuellerTyp-Parameter
Gegeben:class C<E> { … }
class D<T> { … }
Verwendung der Klasse C:
C<D<A>> c = new C<D<A>>();
oder
C<D<D<D<D<D<A>>>>>> c = new C<D<D<D<D<D<A>>>>>>();
![Page 22: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/22.jpg)
22
ParametrisierteTypen:parametrisierterTypalsaktuellerTyp
Gegeben:class A { … }class B<E> { … }
DefinitionderKlasseC:class C<E> {
B<E> b;void set(B<E> b) { this.b = b; }B<E> get() { return this.b; }
}VerwendungderKlasseC:C<A> c = new C<A> ();c.set(new B<A> ());B<A> b = c.get();
Attribut-Typ ist eine Typ-Variable
Formaler Typparameter
Parametrisierter Typ
![Page 23: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/23.jpg)
23
Typ-VariablenmitEinschränkungen:gebundenderParametertyp
DieTyp-VariableEderKlasseisteingeschränktaufCA-kompatibleTypen.
Vom Compiler generierter Raw-Type.
![Page 24: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/24.jpg)
24
SinnvonEinschränkungen
o EinschränkungvonTypenisteinspezifischerKontrakt:¤ Eswirdgarantiert,dassderaktuelleTyp-ParametereinersolchenKlasse
kompatibelzuderdefiniertenEinschränkungist.¤ ÜbereineReferenzvomTypderTyp-Variablenkönnentypsicherallefür
deneinschränkendenTypdefiniertenMethodenaufgerufenwerden.
Ohne Einschränkung auf CA könnte man auf eine E-Referenz nur die Methoden der Klasse Object aufrufen.
Methode m der Klasse CA kann aufgerufen werden.
![Page 25: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/25.jpg)
25
GenerischeKlassenundVererbung
o GenerischeKlassenkönnenSubklassenhaben.o DieSubklasseist
¤ Entwederselbstwiedergenerisch,oder¤ DieSubklasselegtdenTyp-Parameterfestundistdamitnichtgenerisch.
![Page 26: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/26.jpg)
26
GenerischeKlassenundVererbung– Beispiel„GenerischeSubklasse“
Klasse B ist selbst generisch.
![Page 27: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/27.jpg)
27
Klasse C ist nicht generisch –legt den Typ von A fest (bindet den formalen Parameter E an Double)
GenerischeKlassenundVererbung– Beispiel„Nicht-GenerischeSubklasse“
Mischformen sind möglich !!!
![Page 28: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/28.jpg)
28
Generics undSubtyping?
Fehler?!
Ist eine Liste von Strings auch eine Liste von Objekten?
Versuch einem String ein Objekt zuzuweisen!
... sonst ginge das:
Subtyping nicht erlaubt!!!
![Page 29: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/29.jpg)
29
Invarianz
o Generics sindinvariant¤ DieAbleitungsbeziehungzwischenTypargumentenüberträgtsichnichtauf
generischeKlassenà GenerischeTypenvonSubtypensindselberkeineSubtypen(invarianteTypen,keineKovarianz).
¤ EsgibtdaherauchkeinePolymorphiezwischenverschiedenenAusprägungendesselbengenerischenTyps.
![Page 30: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/30.jpg)
30
TypsichereBehandlungvonverschiedenen(generischen)Collections
Beispiel ohne Generics
Naheliegender Ansatz mit Generics
for-each-Schleife
Nur Collections, die mit Objectparametrisiert sind, können an die Methode übergeben werden!Kein Subtyping bei Generics !!!
Hoffnung:• durch die Definition des Methodenparameters als Collection<Object> wird auch Collection<String> akzeptiert.
Realität:• Das ist aber nicht so.• Beide Typen stehen in keinerlei Beziehung zueinander.• Sie sind zwar durch Parameterisierung aus demselben generischen Typ entstanden, aber sie sind in keiner
Weise kompatibel zueinander.
Generics sind invariant
![Page 31: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/31.jpg)
31
Wildcards
o Wildcards<?>à bewusstes„Vergessen“derTypinformationenbzw.zeigenan,dassjedebeliebigeAusprägungeinesgenerischenTyps(=“alleReferenztypen“)möglichist.
o <?> stehtfürunbekannterTypnichtfürObjekt(sonstgältenjadieEinschränkungenvonoben).
o <?>istdieKurzform von<?extends Object>o DamitistesmöglichverschiedeneUnterklassenzusammenzuführen.o Bound Wildcards<?extends E>bzw.<?superE>stellensicher,dassnicht
jedebeliebigeAusprägungdesgenerischenTypssondernnurbestimmtemöglichsind.
o VerwendungvonWildcards:¤ NurbeiderDeklaration vonParameternundVariablen.¤ BeiderObjekterzeugung undderDeklarationvongenerischenTypenkönnensienicht
verwendet werden.EsgibtalsokeineObjekteeinesWildcard-Typs.
![Page 32: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/32.jpg)
32
Wildcards:Beispiel1
Der parame-trisierteTyp Typ von bo2 ist unbekannt.
Der parame-trisierteTyp von bo1 ist Number.
Box <?> bo3 = new Box <?>();
Bei der Erzeugung muss der aktuelle Typparameter angegeben werden, er darf nicht unbekannt bleiben.
![Page 33: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/33.jpg)
33
Wildcards:Beispiel2
• Neuer Ansatz mit Generics
„Collection of unknown“ Wildcard
Akzeptiert alle Arten von Collections!
![Page 34: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/34.jpg)
34
Gebundene/Upper Bound Wildcards
Lösung à später
Nur Subtypen von Number sind als unbekannter generischer Typ zulässig!
Die Nutzung der Box<Number> ist eingeschränkt: setValue() funktioniert nur über die konkrete Box<Integer> (also bI), aber nicht über die allgemeine Box<Number>.Der Zugriff ist unproblematisch.
Auf einem Typ, der mit einem nach oben beschränkten Wildcard parametrisiert ist, dürfen keine Methoden aufgerufen werden, die den Typparameter als Methodenparameter haben.
![Page 35: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/35.jpg)
35
GebundeneWildcardsbeiParametern
Wildcard für alle Klassen die Unterklasse von Shape sind
![Page 36: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/36.jpg)
36
Gebundene/Lower Bound Wildcards
Nur Supertypen von A1 sind als unbekannter generischer Typ zulässig!
![Page 37: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/37.jpg)
37
Mischenvonupper undlower bound Wildcards
Mit der upper bound Wildcard (dem maximalen Typ) funktioniert das Lesen der Daten, aber nicht das Hinzufügen.Lesen von Daten aus generischem Typ è upper boundWildcards
Mit der lower bound Wildcard (dem minimalen Typ) funktioniert nun das Hinzufügen – aber nicht mehr das Lesen der Daten.Hinzufügen von Objekten zu generischem Typ è lowerbound Wildcards
Nur Supertypen von Number sind als unbekannter generischer Typ zulässig!
![Page 38: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/38.jpg)
38
Verwendungvonupper- undlower-bounds
o Lesen vonDatenausgenerischemTypè upper boundWildcards:
<?extends T>à Tistdermaximale Typo Hinzufügen vonObjektenzugenerischemTypè lower
bound Wildcards<?SuperT>à Tistderminmale Typ
![Page 39: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/39.jpg)
39
ZusammenfassendesBeispiel
![Page 40: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/40.jpg)
40
GenerischeMethoden
EineKlassekannganznormalohneGenerics deklariertwerden,abermitMethoden,diedieTypengenerischvorschreiben.o SowohlKlassenmethodenalsauchObjektmethodenkönnenals
generischeMethodendeklariertwerden,z.B.static <E> Stack<E> combine (Stack<E> p).
o ImGegensatzzuKlassenmussderVerwenderdenTyp-Parameternichtexplizitsetzen,derCompilerleitetihnausdenTypendesAufrufsab(typeinference).
o InseltenenFällenmussmandenTypfürdieMethodeexplizitangeben.o InteressantistdiesfürUtility-Klassen,dienurstatischeFunktionen
anbieten,aberselbstnichtalsObjektvorliegen.
Angabe von <E> beimKlassennamen entfälltund verschiebt sichauf die Deklaration derMethode.
Rückgabetyp: Objektder generischenKlasse Stack<E>
Parametertyp: Objektder generischenKlasse Stack<E>
![Page 41: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/41.jpg)
41
GenerischeMethoden:Beispiel1
class MyStack<E> implements Stack<E>
2 Integer Stacks werden zu einem Stack zusammengefasst.
![Page 42: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/42.jpg)
42
GenerischeMethoden:Beispiel2
Fehler zur Compilezeit!
Typparameter Verwendung des Typparameters
![Page 43: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/43.jpg)
43
GenerischeMethodenmitgebundenenParametern
o Typ-Parameterkönnen- analogzuWildcards– aufbestimmteKlassenbeschränktwerden.
o <Textends C>- schränktTaufCundSubklassenvonCein.o <TsuperC>- schränktTaufCundSuperklassenvonCein.
![Page 44: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/44.jpg)
44
GenerischeMethoden:Beispiel3
T muss von Klasse A abgeleitet sein
T muss von Klasse A und den Interfaces I1 und I2 abgeleitet sein
T muss von den Interfaces I1 und I2 abgeleitet sein
![Page 45: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/45.jpg)
45
Generics mitmehrerenTypparametern
![Page 46: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/46.jpg)
46
Generics undArrays
o Generics undArraysunterscheidensichgrundsätzlichundharmonierenimallgemeinenschlecht.
o Arrayssindkovariant (covariant)o Generics sindinvariant (invariant)o ArraysprüfenihrenTypzurLaufzeit(reified)o Generics sindeinCompilezeitkonstrukt,prüfenihrenTyp
deshalbzurCompilezeit (typeerasure).o DieTyplöschungistderGrunddafür,dasArraysnichtso
umgesetztwerdenkönnen,wiemanessichnaivvorstellt.o EsistnichtmöglicheinArrayzuerstellenaus
¤ einemgenerischenTyp(List<E>[])¤ einemparametriertenTyp(List<String>[])¤ einemTyp-Parameter(E[])
![Page 47: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/47.jpg)
47
Kovarianz,Kontravarianz,Invarianz
Vererbung vom Typ des Methodenparameters bzw. Rückgabewerts
Typhierachie des Methodenparameters bleibt unverändert
Typhierarchie des Rückgabewertes der Methode ist mit der Vererbungshierarchie von ClassA und ClassB
Typhierarchie des Methodenparameters ist entgegen der Vererbungshierarchie von ClassA und ClassB
Quelle: Wikipedia
![Page 48: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/48.jpg)
48
Runtime-Klassen
o WasgibtdasfolgendeProgrammaus?
Gibt „true“ aus, weil alle Instanzen einer generischen Klasse dieselbe Runtime-Klasse haben
![Page 49: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/49.jpg)
49
Anwendungsbeispiel:Queue
![Page 50: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/50.jpg)
50
Anwendungsbeispiel:List
![Page 51: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/51.jpg)
51
Anwendungsbeispiel:Node
![Page 52: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/52.jpg)
52
EinsatzvonGenerics
o Allgemein¤ Generics sindeineFormvonPolymorphie.¤ Dieseistimmerdannsinnvoll,wennderCodewiederverwendbarsein
soll.
o Generics kontraPolymorphiedurchSubtyping:¤ Generics fürdieTypsicherheit.¤ VorteilgegenüberCasts durchfrühereFehlererkennung.
o DerEntwicklerwirdnichtgezwungenGenerics zuverwenden.o Eineunchecked Warnungweistdaraufhin,dassdie
Typsicherheitnichtgewährleistetist.
![Page 53: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/53.jpg)
53
Zusammenfassung
o Generics erlaubentypsicherzuprogrammieren¤ TypprüfungenerfolgenbereitszurCompilezeit nichterstzurLaufzeit.
D.h.FehlertretenandenStellenauf,wosieverursachtwerden.¤ Generics helfendabeiProgrammerobusterundwenigerfehleranfällig
zumachen.n DasWegfallenvonCasts machtdenCodeübersichtlicher.n Bedingungenlassensichbesserundeinfacherausdrücken.
o GenerischeKlassenkönnenleichtwiederverwendetwerden.
o InBezugaufArraysistdasKonzeptnochnichtausgereift.
![Page 54: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/54.jpg)
54
Generics – ErweiterungeninJava7
MitJava7istdieTyp-InferenzfürGenerics deutlichverbessertworden:o IndenmeistenSituationenmussmandenTyp-Parameternur
nochbeiderDeklarationsetzen.o BeiderObjekterzeugungkanndieAngabedesTyp-
Parametersdurchdendiamond <>ersetztwerden.
Beispiele:List<String> list = new ArrayList<>();
Map<Integer, String> map = new HashMap<>();
Set<?> set = new HashSet<>();
![Page 55: GENERICS 9. Kapitel - hs-mannheim.deservices.informatik.hs-mannheim.de/~schramm/tpe/files/Kapitel09.pdf · Generics–Realisierung in Java o Genericssind ein Compile-Zeit-Konstrukt,](https://reader030.vdocuments.mx/reader030/viewer/2022041106/5f077bcb7e708231d41d3509/html5/thumbnails/55.jpg)
55
WeitereInfoszuGenerics
o http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdfo http://angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.pdf