Java Generics meistern – Wiederverwendbaren, typsicheren Code erstellen
Java Generics – Wiederverwendbaren, typsicheren Code erstellen
Dieser Leitfaden erklärt Java Generics, wie man generische Klassen und Methoden erstellt und welche Vorteile sie bringen, illustriert mit klaren Beispielen.
Java Generics erlauben es Ihnen, eine Klasse, ein Interface oder eine Methode zu schreiben, die auf vielen verschiedenen Datentypen operieren kann, während sie Compile-Time-Sicherheit behält.
Hinweis: Generics funktionieren nicht mit primitiven Typen (int, float, char, etc.).
Java Generics Klasse
Durch Deklaration eines Typparameters können Sie eine Klasse erstellen, die mit jedem Objekttyp funktioniert.
Beispiel: Generische Klasse erstellen
class Main {
public static void main(String[] args) {
GenericsClass<Integer> intObj = new GenericsClass<>(5);
System.out.println("Generische Klasse zurück: " + intObj.getData());
GenericsClass<String> stringObj = new GenericsClass<>("Java Programming");
System.out.println("Generische Klasse zurück: " + stringObj.getData());
}
}
class GenericsClass<T> {
private T data;
public GenericsClass(T data) {
this.data = data;
}
public T getData() {
return this.data;
}
}
Ausgabe
Generische Klasse zurück: 5 Generische Klasse zurück: Java Programming
Im obigen Beispiel ist GenericsClass eine generische Klasse, wo T der Typparameter ist. Zwei Instanzen werden erstellt:
- intObj – T wird durch
Integerersetzt, sodass die Klasse mit Integern arbeitet. - stringObj – T wird durch
Stringersetzt, sodass die Klasse mit Strings arbeitet.
Java Generics Methode
Methoden können auch generisch sein, was ihnen erlaubt, Argumente beliebigen Typs zu akzeptieren, während sie Typsicherheit behalten.
Beispiel: Generische Methode erstellen
class Main {
public static void main(String[] args) {
DemoClass demo = new DemoClass();
demo.<String>genericsMethod("Java Programming");
demo.<Integer>genericsMethod(25);
}
}
class DemoClass {
public <T> void genericsMethod(T data) {
System.out.println("Generische Methode:");
System.out.println("Übergebene Daten: " + data);
}
}
Ausgabe
Generische Methode: Übergebene Daten: Java Programming Generische Methode: Übergebene Daten: 25
Wenn der Compiler den Typ ableiten kann, können Sie das explizite Typargument weglassen:
demo.genericsMethod("Java Programming");
Bounded Types
Manchmal möchten Sie, dass ein generischer Typ nur eine bestimmte Familie von Klassen akzeptiert. Bounded Types erreichen dies mit dem extends Keyword.
Syntax: <T extends A> – T kann A oder jeder Subtyp von A sein.
Beispiel: Bounded Types
class GenericsClass <T extends Number> {
public void display() {
System.out.println("Dies ist eine bounded type generische Klasse.");
}
}
class Main {
public static void main(String[] args) {
// GenericsClass<String> obj = new GenericsClass<>(); // Compile-Time-Fehler
}
}
Hier akzeptiert GenericsClass nur numerische Typen (Integer, Double, etc.). Der Versuch, es mit String zu instanziieren, verursacht einen Compile-Time-Fehler:
GenericsClass<String> obj = new GenericsClass<>(); ^ reason: inference variable T has incompatible bounds equality constraints: String lower bounds: Number where T is a type-variable: T extends Number declared in class GenericsClass
Vorteile von Java Generics
1. Code-Wiederverwendbarkeit
Generischer Code kann auf mehreren Datentypen operieren und reduziert Duplikation. Zum Beispiel kann eine einzelne Methode Integers, Strings und benutzerdefinierte Objekte verarbeiten.
2. Compile-Time Type Checking
Da der Typparameter zur Compile-Zeit bekannt ist, kann der Compiler Typ-Mismatches erkennen, bevor das Programm läuft.
3. Nahtlose Integration mit Collections
Javas Collection Framework ist generics-basiert, was Collections ermöglicht, Typsicherheit durchzusetzen. Beispiele:
ArrayList<String> list1 = new ArrayList<>();
ArrayList<Integer> list2 = new ArrayList<>();
Andere Collection-Klassen (LinkedList, Queue, Map, etc.) nutzen Generics für die gleichen Vorteile.
Java
- Javas final-Schlüsselwort verstehen: Variablen, Methoden und Klassen
- Java instanceof-Operator: Ein umfassender Leitfaden
- Java-Vererbung meistern: Konzepte, Typen und praktische Beispiele
- Java statische verschachtelte Klassen verstehen: Nutzung, Unterschiede und Beispiele
- Java anonyme innere Klassen meistern: Definition, Syntax und praktische Beispiele
- Java Singleton-Pattern erklärt: Sichere Implementierung und Verwendung
- Java Reflection meistern: Klassen, Methoden und Felder zur Laufzeit inspizieren
- Java ArrayList meistern: Operationen, Methoden und Best Practices
- Java ObjectOutputStream meistern: Serialisierung, Methoden und praktische Beispiele
- Java-Dateioperationen mit java.io meistern – Erstellen, Lesen, Schreiben & Löschen