8. Generics Grundlagen der Programmierung 1 (Java)

Transcription

8. Generics Grundlagen der Programmierung 1 (Java)
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