Generics Einführung
How To ...
Was sind Generics? Wie verwendet man sie?
Hintergründe
Seit Java 5.0 gibt es Generics (generische Typen, generische Klassen). Ein generischer Typ wird durch eine oder mehrere Typvariablen definiert. Die Methoden des Typs benutzen die Typvariablen als Platzhalter für Parameter- und Ergebnistypen.
So geht's
Wir beginnen mit der Verwendung bereits vorhanderner generischer Typen/Klassen. Zur Motivation vergleichen wir die Programmierung ohne generische Typen mit der Programmierung mit generischen Typen. Alle Klassen des Collection-Frameworks sind generische Typen, wir verwenden eine Liste.
Der folgende Quell-Code erzeugt eine Liste von Strings und gibt das letzte Listenelement aus. Die auskommentierte Zeile compiliert, führt dann aber im Aufruf der Methode getLetztesOhneGenerics() zu einem Laufzeitfehler.
public void ohneGenerics() {
List woerter = new ArrayList();
woerter.add("eins");
woerter.add("zwei");
woerter.add("drei");
// woerter.add(new Boolean("true")); // compiliert
String letztes = getLetztesOhneGenerics(woerter);
System.out.println(letztes);
}
private String getLetztesOhneGenerics(List woerter) {
return (String) woerter.get(woerter.size() - 1);
}
Der folgende Quell-Code verwendet eine generische Liste von Strings, tut aber sonst dasselbe. Die auskommentierte Zeile würde zu einem Compile-Fehler führen. Neben dem Entdecken dieser Fehlerquelle durch den Compiler ist noch ein Unterschied in der Methode getLetztesMitGenerics() zu bemerken. Hier erspart man sich den Cast, da der Compiler weis, dass sich nur Strings in der Liste befinden.
public void mitGenerics() {
List<String> woerter = new ArrayList<String>();
woerter.add("eins");
woerter.add("zwei");
woerter.add("drei");
// woerter.add(new Boolean("true")); // compiliert nicht
String letztes = getLetztesMitGenerics(woerter);
System.out.println(letztes);
}
private String getLetztesMitGenerics(List<String> woerter) {
return woerter.get(woerter.size() - 1);
}
Formatierter Quell-Code (Definition)
