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 2. Einfache Programme 3. Kontrollstrukturen 4. Objekt-Orientierung I 5. Algorithmen und Datenstrukturen I 6. Interfaces 7. Pakete 8. Generics 10. Fehler und Ausnahmen 11. Algorithmen und Datenstrukturen II 12. Objektorientierung II 13. Komponenten 14. Design 15. Die Java Klassenbibliothek I 16. Die Java Klassenbibliothek II 17. Software-Kategorien 9. Rekursion 6.12.2005, Seite 2
Agenda Agenda Generics JavaDoc 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# 6.12.2005, Seite 4
Generics Rohtypen Generischer Typ class List<T> { T[] data; List(int size) { void add(t x) { T remove() { wird übersetzt zu Rohtyp 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> List list = new List<String>(10); Object obj = new List<String>(10); Object List List<Integer> x = new List<String>(10); List<Integer> // ok // ok // verboten 6.12.2005, Seite 5
Generics Constraints (Bounded Type Parameters) Annahmen über Platzhaltertypen werden als Basistypen ausgedrückt Interface oder class SortedList <T extends Comparable> { Basisklasse 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 6.12.2005, Seite 6
Generics Generizität und Vererbung class List <T> extends BaseList<T> { kann auch generische Interfaces implementieren 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 class B<X> extends A<String> { generischen Klasse von einer generischen Klasse class B<X> extends A<X> { mit gleichem Platzhalter 6.12.2005, Seite 7
Generics Kompatibilität in Zuweisungen Zuweisung von X<T> an gewöhnliche Oberklasse class A { class B<T> extends A { class C<T,U> extends A { B<T> C<T,U> A A a1 = new B<Integer>(); A a2 = new C<Integer, Float>(); B<Integer> B<Float> C<Integer,Float> C<Float,Integer> Zuweisung von X<T> an generische Oberklasse class A<T> { class B<T> extends A<T> { class C<T,U> extends A<T> { A<T> B<T> C<T,U> A<Integer> a1 = new B<Integer>(); A<Integer> a2 = new C<Integer, Float>(); A<Short> a3 = new B<Integer>(); erlaubt, wenn korrespondierende Platzhalter durch denselben Typ ersetzt wurden verboten 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) { 6.12.2005, Seite 9
Agenda Agenda Generics JavaDoc 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) { 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. * * @author $Author$ * @version $Id$ * * @see javax.swing.text.document * @since * @deprecated */ public class Test { 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 6.12.2005, Seite 13
JavaDoc Erzeugte HTML-Datei (Stack.html) 6.12.2005, Seite 14
JavaDoc Generierung in Eclipse 6.12.2005, Seite 15