8. Generics Grundlagen der Programmierung 1 (Java) Fachhochschule Darmstadt Haardtring 100 D-64295 Darmstadt Prof. Dr. Bernhard Humm FH Darmstadt, 6. Dezember 2005 Einordnung im Kontext der Vorlesung 1. Einführung 10. Fehler und Ausnahmen 2. Einfache Programme 11. Algorithmen und Datenstrukturen II 3. Kontrollstrukturen 12. Objektorientierung II 4. Objekt-Orientierung I 13. Komponenten 5. Algorithmen und Datenstrukturen I 14. Design 6. Interfaces 15. Die Java Klassenbibliothek I 7. Pakete 16. Die Java Klassenbibliothek II 8. Generics 17. Software-Kategorien 9. Rekursion Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 6.12.2005, Seite 2 Agenda Agenda Generics Generics JavaDoc Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 6.12.2005, Seite 3 Generics Generische Klasse List generischer Typ Platzhaltertyp class List<T> { T[] data; List(int size) {...} void add(T x) {...} T remove() {...} } • geht auch für Interfaces interface I<T> • Platzhaltertyp T kann wie normaler Typ verwendet werden Benutzung List<Integer> a = new List<Integer>(100); a.add(3); // nur Integer-Parameter erlaubt; hier Boxing int i = a.remove(); // liefert Integer-Wert; kein Cast nötig aktueller Typparameter muß ein Referenztyp sein (Integer, Rectangle, ...) List<Person> b = new List<Person>(100); b.add(new Person()); // nur Person-Parameter erlaubt Person p = b.remove(); // kein Cast nötig Vorteile • Homogene Datenstruktur mit Compilezeit-Typprüfung • Man muß keine Casts schreiben Generizität auch in Ada, Eiffel, C++ (Templates), C# Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 6.12.2005, Seite 4 Generics Rohtypen Generischer Typ Rohtyp wird übersetzt zu class List<T> { T[] data; List(int size) {...} void add(T x) {...} T remove() {...} } class List { Object[] data; List(int size) {...} void add(Object x) {...} Object remove() {...} } Alle aus List<T> erzeugten Typen werden auf denselben Rohtyp abgebildet List<String> stringList = new List<String>(10); stringList.add("abc"); List<Integer> intList = new List<Integer>(100); intList.add(15); rufen beide add von List auf und übergeben einen Object-Parameter. Compiler stellt aber sicher, daß intList nur mit Integer-Werten verwendet wird. Kompatibilitätsbeziehungen List<String> Object List List list = new List<String>(10); Object obj = new List<String>(10); // ok // ok List<Integer> x = new List<String>(10); // verboten List<Integer> Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 6.12.2005, Seite 5 Generics Constraints (Bounded Type Parameters) Annahmen über Platzhaltertypen werden als Basistypen ausgedrückt Interface oder Basisklasse class SortedList <T extends Comparable> { T[] data = ...; int nElements = 0; ... void add(T elem) { int i = nElements - 1; while (i >= 0 && elem.compareTo(data[i]) > 0) {data[i+1] = data[i]; i--;} data[i+1] = elem; nElements++; } } Erlaubt Operationen auf Elemente von Platzhaltertypen Verwendung SortedList<String> list = new SortedList<String>(); list.add("John"); Parameter muß Comparable unterstützen Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 6.12.2005, Seite 6 Generics Generizität und Vererbung kann auch generische Interfaces implementieren class List <T> extends BaseList<T> { ... } List<T> implements I<T> ... Von welchen Klassen darf eine generische Klasse erben? • von einer gewöhnlichen Klasse class B<X> extends A {...} • von einer konkretisierten generischen Klasse class B<X> extends A<String> {...} • von einer generischen Klasse mit gleichem Platzhalter class B<X> extends A<X> {...} Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 6.12.2005, Seite 7 Generics Kompatibilität in Zuweisungen Zuweisung von X<T> an gewöhnliche Oberklasse A class A {...} class B<T> extends A {...} class C<T,U> extends A {...} B<T> B<Integer> B<Float> ... A a1 = new B<Integer>(); A a2 = new C<Integer, Float>(); C<T,U> ... C<Integer,Float> C<Float,Integer> ... Zuweisung von X<T> an generische Oberklasse A<T> class A<T> {...} class B<T> extends A<T> {...} class C<T,U> extends A<T> {...} B<T> C<T,U> ... A<Integer> a1 = new B<Integer>(); A<Integer> a2 = new C<Integer, Float>(); erlaubt, wenn korrespondierende Platzhalter durch denselben Typ ersetzt wurden A<Short> a3 = new B<Integer>(); verboten Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 6.12.2005, Seite 8 Generics Überschreiben von Methoden class List<T> { ... void add(T x) {...} } Wenn von konkretisierter Klasse geerbt class MyList extends List<Integer> { ... void add(Integer x) {...} } T wird durch konkreten Typ Integer ersetzt Wenn von generischer Klasse geerbt class MyList<T> extends List<T> { ... void add(T x) {...} } T bleibt als Platzhalter Folgendes geht nicht (man kann keinen Platzhalter erben) class MyList extends List<T> { ... void add(T x) {...} } Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 6.12.2005, Seite 9 Agenda Agenda Generics JavaDoc JavaDoc Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 6.12.2005, Seite 10 JavaDoc Dokumentationskommentare Dokumentationskommentare /** ... */ können vor die Deklarationen von Klassen, Methoden, Feldern gesetzt werden. Werkzeug javadoc erzeugt daraus Dokumentation in HTML /** A stack of integers. This is a FIFO data structure storing integers in a stack-like way. */ public class Stack { /** The elements in the stack. */ private int[] data; ... /** Push an integer on the stack. If the stack is full an error is reported and the program stops. */ public void push (int x) { ... } ... } Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 1. Satz bis Punkt wird in Kurzdoku übernommen Rest wird in Langdoku übernommen 6.12.2005, Seite 11 JavaDoc Kommentare für Klassen /** * Description of class or interface. interface. * * @author $Author$ * @version $Id$ * * @see javax.swing.text.Document * @since * @deprecated */ public class Test { ... } Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 6.12.2005, Seite 12 JavaDoc Tag Conventions Standardtags in der Reiheenfolge ihrer Verwendung – @author (Nur bei Klassen und Schnittstellen; Pflicht) – @version (Nur bei Klassen und Schnittstellen; Pflicht) – @param (Nur bei Methoden und Konstructoren ; Pflicht) – @return (Nur bei Methoden ; Pflicht) – @exception (@throws ist ein Synonym seit Javadoc 1.2) – @see – @since – @serial (oder @serialField or @serialData) – @deprecated Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 6.12.2005, Seite 13 JavaDoc Erzeugte HTML-Datei (Stack.html) Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 6.12.2005, Seite 14 JavaDoc Generierung in Eclipse Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 6.12.2005, Seite 15