Generics und Collections - TU · PDF file 2014. 8. 28. · Generics Collections...

Click here to load reader

  • date post

    02-Mar-2021
  • Category

    Documents

  • view

    6
  • download

    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