Generics und Collections - TU · PDF file 2014. 8. 28. · Generics Collections...
date post
02-Mar-2021Category
Documents
view
6download
0
Embed Size (px)
Transcript of Generics und Collections - TU · PDF file 2014. 8. 28. · Generics Collections...
Institut für Programmierung und Reaktive Systeme
Generics und Collections
Markus Reschke
26.08.2014
Generics Collections Framework
Motivation
Zur Zeit zwei Möglichkeiten zur Implementierung von Datenstrukturen
Speicherung von Werten als Object
Gut: Eine Implementierung für alle Datentypen Schlecht: Keine Typsicherheit (Autos in eine Liste von Strings packen)
Speicherung von Werten als konkreter Typ
Gut: Typsicherheit Schlecht: Eine Implementierung für jeden zu speichernden Datentyp
Können wir Typsicherheit haben, ohne den Code zu vervielfachen?
Markus Reschke | Generics und Collections | 2 Institut für Programmierung
und Reaktive Systeme
Generics Collections Framework
Generics - Konzept
Typen bei Attributs- und Methodendefinitionen werden durch Platzhalter ersetzt z.B. insert(T item)
Beim Erzeugen von Objekten und Verwenden von Methoden geben wir die Typen für die Platzhalter an
Compiler überprüft, dass Argumente zu den für die Platzhalter angegebenen Typen passen
Compiler erzeugt Bytecode, in dem statt des Platzhalter-Typs Object verwendet wird (Type Erasure)
Markus Reschke | Generics und Collections | 3 Institut für Programmierung
und Reaktive Systeme
Generics Collections Framework
Generische Klassen in Java
Typparameter werden hinter der Klasse in spitzen Klammern aufgelistet.
Können danach in der Klasse als Typangaben beim Definieren von Referenzen (lokal, Attribute, Parameter) verwendet werden
Analog für Interfaces (siehe weiter unten)
1 public class Pair {
2 ...
3 public E1 getFirst () {
4 }
5 ...
6 }
Markus Reschke | Generics und Collections | 4 Institut für Programmierung
und Reaktive Systeme
Generics Collections Framework
Type Erasure
Typparameter werden nach der Typüberprüfung beim Kompilieren durch Object ersetzt Der Compiler erzeugt nur diese eine Implementierung für alle möglichen Typen Typ ist nur Laufzeit nicht verfügbar Daher auch keine generische Objekterzeugung möglich (also kein new 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 | 5 Institut für Programmierung
und Reaktive Systeme
Generics Collections Framework
Verkettete Liste
Siehe Vorlesung (Live)
Markus Reschke | Generics und Collections | 6 Institut für Programmierung
und Reaktive Systeme
Generics Collections Framework
Eine Klasse für Paare
Siehe Vorlesung (Live)
Markus Reschke | Generics und Collections | 7 Institut für Programmierung
und Reaktive Systeme
Generics Collections Framework
Das Interface Comparable
Besitzt Methode public int compareTo(T obj)
Benutzung: o1.compareTo(o2)
Soll etwas negatives zurückgeben, wenn o1 < o2
Soll 0 zurückgeben, wenn o1 == o2
Soll etwas positives zurückgeben, wenn o1 > o2
1 public class Counter implements Comparable {
2 ...
3 public int compareTo(Counter c) {
4 return getCount () - c.getCount ();
5 }
6 }
Markus Reschke | Generics und Collections | 8 Institut für Programmierung
und Reaktive Systeme
Generics Collections Framework
Typebounds
Manchmal muss ein Typ für einen Typparameter bestimmte Eigenschaften erfüllen (z.B. Vergleichbarkeit)
Typebounds beschränken die möglichen Typen für einen Parameter
Syntax: T extends B1 & B2 & B3
Maximal eine Klasse als Bound möglich, Rest Interfaces (Klasse muss erster Bound sein)
T muss von den Bound-Typen abgeleitet sein oder diese implementieren
Immer extends, auch bei Interfaces!!!
1 public class SortedList {
2 ...
3 }
Generics Collections Framework
Generische Methoden
Auch Methoden (statische und nicht statische) können generisch sein.
Typparameter werden vor dem Rückgabetyp der Methode angegeben
Compiler versucht, bei der Verwendung die Typen für die Parameter herzuleiten
Daher: oft keine explizite Angabe nötig
Falls nötig, möglich mit KlasseOderObjekt.methode(Argumente)
1 public class Utils {
2 ...
3 public static 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 | 11 Institut 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 ls = new LList ();
2 LList lo = ls; //Nicht moeglich durch Invarianz
3 lo.add(new Object ());
Markus Reschke | Generics und Collections | 12 Institut für Programmierung
und Reaktive Systeme
Generics Collections Framework
Wildcards
Wildcards heben Invarianz von Referenzen teilweise auf
Schränken dafür Zugriffe ein
Drei Arten:
Kovarianz Kontravarianz Bivarianz
Tipp um Varianz zu verstehen: Was weiß der Compiler über die Typen?
Markus Reschke | Generics und Collections | 13 Institut für Programmierung
und Reaktive Systeme
Generics Collections Framework
Kovarianz
Syntax: Klasse
Generics Collections Framework
Kontravarianz
Syntax: Klasse
Generics Collections Framework
Bivarianz
Syntax: Klasse
Zuweisungskompatibel für alle Typargumente
Schreiben verboten
Lesen nur als Objekt
1 Integer i2 = 0;
2 Object x2 = null;
3 LinkedList l2 = new LinkedList ();
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 | 16 Institut für Programmierung
und Reaktive Systeme
Generics Collections Framework
Generische Paarsumme
Siehe Utils.java und PairExample.java
Markus Reschke | Generics und Collections | 17 Institut für Programmierung
und Reaktive Systeme
Generics Collections Framework
Klausuraufgabe (Übungsklausur)
Siehe InsertionSort.java und InsertionSortGen.java
Markus Reschke | Generics und Collections | 18 Institut 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 | 19 Institut für Programmierung
und Reaktive Systeme
Generics Collections Framework
LinkedList
LinkedList
Generische Implementierung einer verlinkten Liste
Markus Reschke | Generics und Collections | 20 Institut für Programmierung
und Reaktive Systeme
Generics Collections Framework
LinkedList
Siehe LinkedListEx.java
Markus Reschke | Generics und Collections | 21 Institut für Programmierung
und Reaktive Systeme
Generics Collections Framework
ArrayList
ArrayList
Generische Implementierung einer arraybasierten Liste
Markus Reschke | Generics und Collections | 22 Institut für Programmierung
und Reaktive Systeme
Generics Collections Framework
Iterable und Iterator
Iterator ist ein Interface, das Methoden zum elementweisen Laufen durch eine Datenstruktur bereitstellt
public boolean hasNext() gibt an, ob die Datenstruktur noch Elemente enthält
public T next() gibt das nächste Element zurück
public void remove() entfernt das letzte von next() zurückgegebene Element
Iterable ist ein Interface, welches angibt, dass man für die implementierende Klasse einen Iterator bekommen kann
public Iterator iterator() gibt einen Iterator für eine Klasse zurück
Klassen, die Iterable implementieren, können mit der for-each-Schleife verwendet werden.
Markus Reschke | Generics und Collections | 23 Institut für Programmierung
und Reaktive Systeme
Generics Collections Framework
HashMap
HashMap
Generische Implementierung hashbasierten Map
Implementiert Interface Map
Ordnet einem Wert von Typ K (Schlüssel) 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 | 24 Institut für Programmierung
und Reaktive Systeme