Upload
others
View
60
Download
0
Embed Size (px)
Citation preview
Institut für Programmierungund Reaktive Systeme
Generics und Collections
Markus Reschke
26.08.2014
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
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
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
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
Generics Collections Framework
Verkettete Liste
Siehe Vorlesung (Live)
Markus Reschke | Generics und Collections | 6Institut für Programmierung
und Reaktive Systeme
Generics Collections Framework
Eine Klasse fur Paare
Siehe Vorlesung (Live)
Markus Reschke | Generics und Collections | 7Institut für Programmierung
und Reaktive Systeme
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
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 }
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");
Generics Collections Framework
Generisches Maximum
Siehe Utils.java und UtilsExample.java
Markus Reschke | Generics und Collections | 11Institut für Programmierung
und Reaktive Systeme
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
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
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
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
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
Generics Collections Framework
Generische Paarsumme
Siehe Utils.java und PairExample.java
Markus Reschke | Generics und Collections | 17Institut für Programmierung
und Reaktive Systeme
Generics Collections Framework
Klausuraufgabe (Ubungsklausur)
Siehe InsertionSort.java und InsertionSortGen.java
Markus Reschke | Generics und Collections | 18Institut für Programmierung
und Reaktive Systeme
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
Generics Collections Framework
LinkedList
LinkedList<T>
Generische Implementierung einer verlinkten Liste
Markus Reschke | Generics und Collections | 20Institut für Programmierung
und Reaktive Systeme
Generics Collections Framework
LinkedList
Siehe LinkedListEx.java
Markus Reschke | Generics und Collections | 21Institut für Programmierung
und Reaktive Systeme
Generics Collections Framework
ArrayList
ArrayList<T>
Generische Implementierung einer arraybasierten Liste
Markus Reschke | Generics und Collections | 22Institut für Programmierung
und Reaktive Systeme
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
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
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
Generics Collections Framework
Hash Map
Siehe HashEx.java
Markus Reschke | Generics und Collections | 26Institut für Programmierung
und Reaktive Systeme
Generics Collections Framework
Zusammenfassung
Generische Klassen
Generische Methoden
Typebounds
Varianz
Listen
Hashmaps
Markus Reschke | Generics und Collections | 27Institut für Programmierung
und Reaktive Systeme