Generische Methoden
Bisher haben wir Typparameter dafür eingesetzt, um Datentypen zu parametrisieren. Java ermöglicht uns aber auch, einzelne Methoden mit Typparameter zu parametrisieren. Wir können dann dieselbe Methode für Parameter verschiedenen Typs ausdrücken. Dies kommt vor allem bei Klassenmethoden zum Einsatz.
Da das Konzept genau Analog zur definition von parametrischen Typen mit Klassen ist, schauen wir uns dazu direkt zwei Beispiele an:
Im ersten Beispiel schreiben wir uns eine Klassenmethode an.
Diese nimmt eine Liste beliebigen Typs E
als Parameter entgegen.
Zurückgegeben wird dann das erste Element dieser Liste.
class Util {
public static <E> E extractFirst(List<E> list) {
if (list.size() > 0) {
return list.get(0);
} else {
return null;
}
}
}
Wir beachten, dass wir den Typparameter nach den Modifikatoren (hier public
und static
) und direkt vor dem Rückgabetyp (hier E
) definieren. Wie bei Klassen nutzen wir auch hier die Klammern <>
.
Den Typ können wir wie zuvor einfach an jeder Stelle anwenden, an der ein Typ stehen kann.
Die Methode selbst kann ganz normal verwendet werden.
Wir müssen keine Typparameter angeben, da Java diese Information direkt aus den Argumenten schliessen kann:
class Main {
public static void main(String[] args) {
List<Integer> l = new LinkedList<Integer>();
Util.extractFirst(l); // Aufruf der generischen Methode
}
}
Das zweite Beispiel illustriert, dass auch hier Typeinschränkungen eingesetzt werden können.
class Util {
public static <T extends Comparable<T>> T max(T e1, T e2) {
if (e1.compareTo(e2) < 0) {
return e2;
} else {
return e1;
}
}
}
Experimentieren Sie am besten doch gleich selbst mit generischen Methoden.