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