Download - Generics und Collections - TU Braunschweig · 2014. 8. 28. · Generics Collections Framework Generics - Konzept Typen bei Attributs- und Methodende nitionen werden durch Platzhalter

Transcript
Page 1: Generics und Collections - TU Braunschweig · 2014. 8. 28. · Generics Collections Framework Generics - Konzept Typen bei Attributs- und Methodende nitionen werden durch Platzhalter

Institut für Programmierungund Reaktive Systeme

Generics und Collections

Markus Reschke

26.08.2014

Page 2: Generics und Collections - TU Braunschweig · 2014. 8. 28. · Generics Collections Framework Generics - Konzept Typen bei Attributs- und Methodende nitionen werden durch Platzhalter

Generics Collections Framework

Motivation

Zur Zeit zwei Moglichkeiten zur Implementierung von Datenstrukturen

Speicherung von Werten als Object

Gut: Eine Implementierung fur alle DatentypenSchlecht: Keine Typsicherheit (Autos in eine Liste von Strings packen)

Speicherung von Werten als konkreter Typ

Gut: TypsicherheitSchlecht: Eine Implementierung fur jeden zu speichernden Datentyp

Konnen wir Typsicherheit haben, ohne den Code zu vervielfachen?

Markus Reschke | Generics und Collections | 2Institut für Programmierung

und Reaktive Systeme

Page 3: Generics und Collections - TU Braunschweig · 2014. 8. 28. · Generics Collections Framework Generics - Konzept Typen bei Attributs- und Methodende nitionen werden durch Platzhalter

Generics Collections Framework

Generics - Konzept

Typen bei Attributs- und Methodendefinitionen werden durchPlatzhalter ersetzt z.B. insert(T item)

Beim Erzeugen von Objekten und Verwenden von Methoden gebenwir die Typen fur die Platzhalter an

Compiler uberpruft, dass Argumente zu den fur die Platzhalterangegebenen Typen passen

Compiler erzeugt Bytecode, in dem statt des Platzhalter-TypsObject verwendet wird (Type Erasure)

Markus Reschke | Generics und Collections | 3Institut für Programmierung

und Reaktive Systeme

Page 4: Generics und Collections - TU Braunschweig · 2014. 8. 28. · Generics Collections Framework Generics - Konzept Typen bei Attributs- und Methodende nitionen werden durch Platzhalter

Generics Collections Framework

Generische Klassen in Java

Typparameter werden hinter der Klasse in spitzen Klammernaufgelistet.

Konnen danach in der Klasse als Typangaben beim Definieren vonReferenzen (lokal, Attribute, Parameter) verwendet werden

Analog fur Interfaces (siehe weiter unten)

1 public class Pair <E1,E2 > {

2 ...

3 public E1 getFirst () {

4 }

5 ...

6 }

Markus Reschke | Generics und Collections | 4Institut für Programmierung

und Reaktive Systeme

Page 5: Generics und Collections - TU Braunschweig · 2014. 8. 28. · Generics Collections Framework Generics - Konzept Typen bei Attributs- und Methodende nitionen werden durch Platzhalter

Generics Collections Framework

Type Erasure

Typparameter werden nach der Typuberprufung beim Kompilierendurch Object ersetztDer Compiler erzeugt nur diese eine Implementierung fur allemoglichen TypenTyp ist nur Laufzeit nicht verfugbarDaher auch keine generische Objekterzeugung moglich (also keinnew T())

1 public class Pair {

2

3 // T foobar = new T() ist nicht moeglich

4

5 ...

6 public Object getFirst () {

7 }

8 ...

9 }

Markus Reschke | Generics und Collections | 5Institut für Programmierung

und Reaktive Systeme

Page 6: Generics und Collections - TU Braunschweig · 2014. 8. 28. · Generics Collections Framework Generics - Konzept Typen bei Attributs- und Methodende nitionen werden durch Platzhalter

Generics Collections Framework

Verkettete Liste

Siehe Vorlesung (Live)

Markus Reschke | Generics und Collections | 6Institut für Programmierung

und Reaktive Systeme

Page 7: Generics und Collections - TU Braunschweig · 2014. 8. 28. · Generics Collections Framework Generics - Konzept Typen bei Attributs- und Methodende nitionen werden durch Platzhalter

Generics Collections Framework

Eine Klasse fur Paare

Siehe Vorlesung (Live)

Markus Reschke | Generics und Collections | 7Institut für Programmierung

und Reaktive Systeme

Page 8: Generics und Collections - TU Braunschweig · 2014. 8. 28. · Generics Collections Framework Generics - Konzept Typen bei Attributs- und Methodende nitionen werden durch Platzhalter

Generics Collections Framework

Das Interface Comparable<T>

Besitzt Methode public int compareTo(T obj)

Benutzung: o1.compareTo(o2)

Soll etwas negatives zuruckgeben, wenn o1 < o2

Soll 0 zuruckgeben, wenn o1 == o2

Soll etwas positives zuruckgeben, wenn o1 > o2

1 public class Counter implements Comparable <Counter > {

2 ...

3 public int compareTo(Counter c) {

4 return getCount () - c.getCount ();

5 }

6 }

Markus Reschke | Generics und Collections | 8Institut für Programmierung

und Reaktive Systeme

Page 9: Generics und Collections - TU Braunschweig · 2014. 8. 28. · Generics Collections Framework Generics - Konzept Typen bei Attributs- und Methodende nitionen werden durch Platzhalter

Generics Collections Framework

Typebounds

Manchmal muss ein Typ fur einen Typparameter bestimmteEigenschaften erfullen (z.B. Vergleichbarkeit)

Typebounds beschranken die moglichen Typen fur einen Parameter

Syntax: T extends B1 & B2 & B3

Maximal eine Klasse als Bound moglich, Rest Interfaces (Klassemuss erster Bound sein)

T muss von den Bound-Typen abgeleitet sein oder dieseimplementieren

Immer extends, auch bei Interfaces!!!

1 public class SortedList <T extends Comparable <T>> {

2 ...

3 }

Page 10: Generics und Collections - TU Braunschweig · 2014. 8. 28. · Generics Collections Framework Generics - Konzept Typen bei Attributs- und Methodende nitionen werden durch Platzhalter

Generics Collections Framework

Generische Methoden

Auch Methoden (statische und nicht statische) konnen generischsein.

Typparameter werden vor dem Ruckgabetyp der Methodeangegeben

Compiler versucht, bei der Verwendung die Typen fur die Parameterherzuleiten

Daher: oft keine explizite Angabe notig

Falls notig, moglich mit KlasseOderObjekt.<Typen>methode(Argumente)

1 public class Utils {

2 ...

3 public static <T extends Comparable <T>> T min(T a, T b) {...}

4 ...

5 }

6 ...

7 String min = Utils.min("a","b");

Page 11: Generics und Collections - TU Braunschweig · 2014. 8. 28. · Generics Collections Framework Generics - Konzept Typen bei Attributs- und Methodende nitionen werden durch Platzhalter

Generics Collections Framework

Generisches Maximum

Siehe Utils.java und UtilsExample.java

Markus Reschke | Generics und Collections | 11Institut für Programmierung

und Reaktive Systeme

Page 12: Generics und Collections - TU Braunschweig · 2014. 8. 28. · Generics Collections Framework Generics - Konzept Typen bei Attributs- und Methodende nitionen werden durch Platzhalter

Generics Collections Framework

Invarianz generischer Typen

Generische Typen sind nur zu sich selber zuweisungskompatibel

Generische Referenzen sind daher invariant

1 LList <String > ls = new LList <String >();

2 LList <Object > lo = ls; //Nicht moeglich durch Invarianz

3 lo.add(new Object ());

Markus Reschke | Generics und Collections | 12Institut für Programmierung

und Reaktive Systeme

Page 13: Generics und Collections - TU Braunschweig · 2014. 8. 28. · Generics Collections Framework Generics - Konzept Typen bei Attributs- und Methodende nitionen werden durch Platzhalter

Generics Collections Framework

Wildcards

Wildcards heben Invarianz von Referenzen teilweise auf

Schranken dafur Zugriffe ein

Drei Arten:

KovarianzKontravarianzBivarianz

Tipp um Varianz zu verstehen: Was weiß der Compiler uber dieTypen?

Markus Reschke | Generics und Collections | 13Institut für Programmierung

und Reaktive Systeme

Page 14: Generics und Collections - TU Braunschweig · 2014. 8. 28. · Generics Collections Framework Generics - Konzept Typen bei Attributs- und Methodende nitionen werden durch Platzhalter

Generics Collections Framework

Kovarianz

Syntax: Klasse<? extends ObereGrenze>

Zuweisungskompatibel, wenn Typargument von der oberen Grenzeabgeleitet oder gleich dieser ist

Schreibende Zugriffe verboten, da der echte Typ spezifischer seinkonnte

Lesen als Typ der Obergrenze erlaubt

1 Integer i2 = 0;

2 Object x2 = null;

3 LinkedList <? extends Integer > l2 = new LinkedList <Integer >();

4 l2.add(4); // Schreiben verboten , da Typ spezifischer sein kann

5 i2 = l2.get (0); //Lesen erlaubt , da Typ kompatibel zu Integer

6 x2 = l2.get (0); // Object lesen erlaubt

Markus Reschke | Generics und Collections | 14Institut für Programmierung

und Reaktive Systeme

Page 15: Generics und Collections - TU Braunschweig · 2014. 8. 28. · Generics Collections Framework Generics - Konzept Typen bei Attributs- und Methodende nitionen werden durch Platzhalter

Generics Collections Framework

Kontravarianz

Syntax: Klasse<? super UntereGrenze>

Zuweisungskompatibel, wenn Typargument Oberklasse der unterenGrenze oder gleich dieser ist

Schreibende Zugriffe erlaubt, wenn Typ spezifischer als untereGrenze

Lesen nur als Objekt

1 Integer i2 = 0;

2 Object x2 = null;

3 LinkedList <? super Integer > l2 = new LinkedList <Integer >();

4 l2.add(4); // Schreiben erlaubt , Liste kann Integer oder etwas

generelleres speichern

5 i2 = l2.get (0); // Lesen als Integer verboten , Liste koennte

Objects speichern

6 x2 = l2.get (0); // Object lesen erlaubt

Markus Reschke | Generics und Collections | 15Institut für Programmierung

und Reaktive Systeme

Page 16: Generics und Collections - TU Braunschweig · 2014. 8. 28. · Generics Collections Framework Generics - Konzept Typen bei Attributs- und Methodende nitionen werden durch Platzhalter

Generics Collections Framework

Bivarianz

Syntax: Klasse<?>

Zuweisungskompatibel fur alle Typargumente

Schreiben verboten

Lesen nur als Objekt

1 Integer i2 = 0;

2 Object x2 = null;

3 LinkedList <?> l2 = new LinkedList <Integer >();

4 l2.add(4); // Schreiben verboten , Typ koennte spezifischer als

Integer sein

5 i2 = l2.get (0); // Lesen als Integer verboten , Liste koennte

Objects speichern

6 x2 = l2.get (0); // Object lesen erlaubt

Markus Reschke | Generics und Collections | 16Institut für Programmierung

und Reaktive Systeme

Page 17: Generics und Collections - TU Braunschweig · 2014. 8. 28. · Generics Collections Framework Generics - Konzept Typen bei Attributs- und Methodende nitionen werden durch Platzhalter

Generics Collections Framework

Generische Paarsumme

Siehe Utils.java und PairExample.java

Markus Reschke | Generics und Collections | 17Institut für Programmierung

und Reaktive Systeme

Page 18: Generics und Collections - TU Braunschweig · 2014. 8. 28. · Generics Collections Framework Generics - Konzept Typen bei Attributs- und Methodende nitionen werden durch Platzhalter

Generics Collections Framework

Klausuraufgabe (Ubungsklausur)

Siehe InsertionSort.java und InsertionSortGen.java

Markus Reschke | Generics und Collections | 18Institut für Programmierung

und Reaktive Systeme

Page 19: Generics und Collections - TU Braunschweig · 2014. 8. 28. · Generics Collections Framework Generics - Konzept Typen bei Attributs- und Methodende nitionen werden durch Platzhalter

Generics Collections Framework

Java Collections Framework

Bietet fertige Implementierung einiger Datenstrukturen

Generisch

Interfaces trennen Datentypen von Implementierung

Im Paket java.util

Markus Reschke | Generics und Collections | 19Institut für Programmierung

und Reaktive Systeme

Page 20: Generics und Collections - TU Braunschweig · 2014. 8. 28. · Generics Collections Framework Generics - Konzept Typen bei Attributs- und Methodende nitionen werden durch Platzhalter

Generics Collections Framework

LinkedList

LinkedList<T>

Generische Implementierung einer verlinkten Liste

Markus Reschke | Generics und Collections | 20Institut für Programmierung

und Reaktive Systeme

Page 21: Generics und Collections - TU Braunschweig · 2014. 8. 28. · Generics Collections Framework Generics - Konzept Typen bei Attributs- und Methodende nitionen werden durch Platzhalter

Generics Collections Framework

LinkedList

Siehe LinkedListEx.java

Markus Reschke | Generics und Collections | 21Institut für Programmierung

und Reaktive Systeme

Page 22: Generics und Collections - TU Braunschweig · 2014. 8. 28. · Generics Collections Framework Generics - Konzept Typen bei Attributs- und Methodende nitionen werden durch Platzhalter

Generics Collections Framework

ArrayList

ArrayList<T>

Generische Implementierung einer arraybasierten Liste

Markus Reschke | Generics und Collections | 22Institut für Programmierung

und Reaktive Systeme

Page 23: Generics und Collections - TU Braunschweig · 2014. 8. 28. · Generics Collections Framework Generics - Konzept Typen bei Attributs- und Methodende nitionen werden durch Platzhalter

Generics Collections Framework

Iterable und Iterator

Iterator<T> ist ein Interface, das Methoden zum elementweisenLaufen durch eine Datenstruktur bereitstellt

public boolean hasNext() gibt an, ob die Datenstruktur noch Elementeenthalt

public T next() gibt das nachste Element zuruck

public void remove() entfernt das letzte von next() zuruckgegebeneElement

Iterable<T> ist ein Interface, welches angibt, dass man fur dieimplementierende Klasse einen Iterator bekommen kann

public Iterator<T> iterator() gibt einen Iterator fur eine Klasse zuruck

Klassen, die Iterable<T> implementieren, konnen mit derfor-each-Schleife verwendet werden.

Markus Reschke | Generics und Collections | 23Institut für Programmierung

und Reaktive Systeme

Page 24: Generics und Collections - TU Braunschweig · 2014. 8. 28. · Generics Collections Framework Generics - Konzept Typen bei Attributs- und Methodende nitionen werden durch Platzhalter

Generics Collections Framework

HashMap

HashMap<K,V>

Generische Implementierung hashbasierten Map

Implementiert Interface Map<K,V>

Ordnet einem Wert von Typ K (Schlussel) einen vom Typ V (Wert)zu.

Intern vorstellbar als Array

Auswahl des Speicherplatzes anhand des hashCode()-Wertes

Dadurch schnelles Holen, falls wenige Kollisionen durch hashCode()

Markus Reschke | Generics und Collections | 24Institut für Programmierung

und Reaktive Systeme

Page 25: Generics und Collections - TU Braunschweig · 2014. 8. 28. · Generics Collections Framework Generics - Konzept Typen bei Attributs- und Methodende nitionen werden durch Platzhalter

Generics Collections Framework

hashCode()

Wird von Object geerbt

public int hashCode()

Standardmaßig: Wird aus Objekt-ID berechnet, nicht aus denAttributwerten

Gute Definition schwierig

IDEs generieren gute Implementierungen

Uberschreiben notig, falls auch equals() uberschrieben wurde

Markus Reschke | Generics und Collections | 25Institut für Programmierung

und Reaktive Systeme

Page 26: Generics und Collections - TU Braunschweig · 2014. 8. 28. · Generics Collections Framework Generics - Konzept Typen bei Attributs- und Methodende nitionen werden durch Platzhalter

Generics Collections Framework

Hash Map

Siehe HashEx.java

Markus Reschke | Generics und Collections | 26Institut für Programmierung

und Reaktive Systeme

Page 27: Generics und Collections - TU Braunschweig · 2014. 8. 28. · Generics Collections Framework Generics - Konzept Typen bei Attributs- und Methodende nitionen werden durch Platzhalter

Generics Collections Framework

Zusammenfassung

Generische Klassen

Generische Methoden

Typebounds

Varianz

Listen

Hashmaps

Markus Reschke | Generics und Collections | 27Institut für Programmierung

und Reaktive Systeme