Algorithmen und Datenstrukturen II

Algorithmen und Datenstrukturen II Robert Giegerich Bioinformatics Resource Facility Center for Biotechnology Universität Bielefeld Vorlesung Sommer 2...
Author: Carin Schräder
2 downloads 4 Views 1MB Size
Algorithmen und Datenstrukturen II Robert Giegerich Bioinformatics Resource Facility Center for Biotechnology Universität Bielefeld Vorlesung Sommer 2011 Robert Giegerich A&D II, Vorlesung SS2011

Universität Bielefeld

Was heißt „generic“? In Java: Abstraktion über Typen

© Pons Wörterbuch - www.pons.de

Robert Giegerich A&D II, Vorlesung SS2011

Universität Bielefeld

Einsatz von Generics l 

Beispiel Container Typen:

List liste = new ArrayList(); liste.add(new Double(0)); Double zahl = (Double) liste.get(0); List liste = new ArrayList(); liste.add(new Double(0)); Double zahl = liste.get(0);

Robert Giegerich A&D II, Vorlesung SS2011

Universität Bielefeld

Wozu Generics? l 

l 

Generics helfen Fehler zu vermeiden l 

Typsicherheit verhindert Laufzeitfehler

l 

Fehler werden bereits beim Kompilieren entdeckt

Beispiel – Liste von Zahlen: List liste = new ArrayList(); liste.add(new Double(0));

Robert Giegerich A&D II, Vorlesung SS2011

Universität Bielefeld

Wozu Generics? l 

Angenommen, später im Programm fügen wir unserer Liste von Zahlen (!) ein weiteres Element hinzu:

liste.add(„20“); // Achtung String! Zugriff auf alle Elemente der Liste … for (int i=0; i Beispiele im Java API

Robert Giegerich A&D II, Vorlesung SS2011

Universität Bielefeld

Wie funktionieren Generics? l 

Beispiel: Eine „generische“ Box public class Box { private T t; // T = formaler Typparameter public void add(T t) { this.t = t; }

} l 

public T get() { return t; }

Instanzierung und Benutzung: Box meineBox = new Box(); Integer x = meineBox.get(); // kein Cast notwendig!

Robert Giegerich A&D II, Vorlesung SS2011

Universität Bielefeld

Typ-Variablen != Typen l 

Wichtig: Typ-Variablen sind keine echten Typen l 

Es gibt keine Klassen und Dateien, wie z.B.

T.java oder T.class l 

l 

Alle generischen Informationen werden beim Kompilieren vollständig entfernt Auch möglich: Mehrere Typ Parameter l 

z.B. public class Box

l 

Aber Achtung! Nicht public class Box

Robert Giegerich A&D II, Vorlesung SS2011

Universität Bielefeld

Namensgebung und Konventionen l 

E – Element (wird vom Java Collections Framework benutzt)

l 

K – Key

l 

N – Number

l 

T – Type

l 

V – Value

l 

S,U,V – zweiter, dritter, vierter Typ usw.

Robert Giegerich A&D II, Vorlesung SS2011

Universität Bielefeld

Generische Methoden und Konstruktoren class Box { private T t; // T = formaler Typparameter public boolean pruefe(Object u) { //if(u instanceof T){ //...ist guter Stil funktioniert hier leider nicht ! //Generics werden zur Compilezeit ausgewertet 'instanceof' zur Laufzeit.

}

if (t.getClass().getName().equals(u.getClass().getName())) { return true; } else { return false; }

public void add(T t) { this.t = t; }

} // Hauptprogramm: Box box = new Box(); box.add(2.0); System.out.println(box.pruefe("EINUNDZWANZIG"));

Robert Giegerich A&D II, Vorlesung SS2011

Universität Bielefeld

Bounded Type Parameters public class Box { private T t; // T = formaler Typparameter public void add(T t) { this.t = t; } public T get() { return t; } } // Hauptprogramm: Box box = new Box(); box.add(2.0); box.add(“EINUNDZWANZIG“) // Kompilierfehler! Und was ist mit Box box2 … ? Robert Giegerich A&D II, Vorlesung SS2011

Universität Bielefeld

Subtyping l 

„is a“- relationship:

Object beliebig = new Object(); Integer zahl = new Integer(10); beliebig = zahl; // OK, oder? l 

Methoden:

public void eineMethode(Number n) { // … } eineMethode(new Integer(10)); // OK, oder? eineMethode(new Double(99.3)); // OK, oder?

Robert Giegerich A&D II, Vorlesung SS2011

Universität Bielefeld

Subtyping l 

Generics:

List liste = new Liste(); liste.add(new Integer(99)); liste.add(new Double(0.22)); // OK, oder? l 

Welche Argumente akzeptiert die folgende Methode?

public void add(List liste) { // … } add(new ArrayList()); // OK, oder? add(new ArrayList()); // Immer noch OK? Robert Giegerich A&D II, Vorlesung SS2011

Universität Bielefeld

Subtyping l 

Die Antwort ist: NEIN! l 

l 

ArrayList ist nicht vom Typ List

Hint: Cage extends Collection

© cobald123 http://www.flickr.com/ photos/cobalt/1462679117/ © terriem http://www.flickr.com/photos/terriem/3683049691/

Robert Giegerich A&D II, Vorlesung SS2011

Universität Bielefeld

Wildcards l 

Gibt es doch eine Lösung?

public void add(List liste) { ... l 

→ Der Wildcard character „?“

public void add(List