English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
In Java,GenerischeHilft bei der Erstellung von Klassen, Interfaces und Methoden, die mit verschiedenen Typen von Objekten (Daten) verwendet werden können. Daher ermöglichen sie es uns, unseren Code zu wiederverwenden.
HinweisBedeutung:GenerischeGenerics sind nicht fürPrimitive-Typen (int, float, char usw.) geeignet.
Um zu verstehen, wie man in Java verwendetGenerischekönnen wir die Klassen der Java-Sammelbibliothek verwenden.
Die ArrayList-Klasse ist ein Beispiel für eine generische Klasse. Wir können ArrayList verwenden, um jeden Typ von Daten zu speichern. Zum Beispiel
import java.util.ArrayList; class Main { public static void main(String[] args) { //Erstellen Sie eine Arrayliste, um Integer-Daten zu speichern ArrayList<Integer> list1 = new ArrayList<>(); list1.add(4); list1.add(5); System.out.println("ArrayList of Integer: ") + list1); //Erstellen Sie eine Arrayliste, um String-Daten zu speichern ArrayList<String> list2 = new ArrayList<>(); list2.add("Four"); list2.add("Five"); System.out.println("ArrayList of String: ") + list2); //Erstellen Sie eine Arrayliste, um Double-Daten zu speichern ArrayList<Double> list3 = new ArrayList<>(); list3.add(4.5); list3.add(6.5); System.out.println("ArrayList of Double: "," + list3); } }
Ausgaberesultat
ArrayList of Integer: [4, 5] ArrayList of String: [Four, Five] ArrayList of Double: [4.5, 6.5]
Im obigen Beispiel haben wir die gleiche ArrayList-Klasse verwendet, um Elemente des Typs Integer, String und Double zu speichern. DaJava Generics, das ist möglich.
Hier beachten Sie diese Zeile,
ArrayList<Integer> list1 = new ArrayList<>();
Wir haben Integer in eckigen Klammern verwendet. Eckige Klammern werden in Generics alsTypparameter.
Der Parameter type wird verwendet, um den Typ der Objekte (Daten) zu spezifizieren, für die die generische Klasse oder Methode geeignet ist.
Nun, da wir wissen, wie Generics in Java funktionieren, schauen wir uns an, wie man seine eigenen generischen Klassen erstellt.
class Main { public static void main(String[] args) { //Die generische Klasse mit Integer-Daten initialisieren GenericsClass<Integer> intObj = new GenericsClass<>(5); System.out.println("Die generische Klasse gibt zurück:"," + intObj.getData()); //Die generische Klasse mit String-Daten initialisieren GenericsClass<String> stringObj = new GenericsClass<>("Java Programming"); System.out.println("Die generische Klasse gibt zurück:"," + stringObj.getData()); } } class GenericsClass<T> { //Variablen-Typ T private T data; public GenericsClass(T data) { this.data = data; } //Methode zur Rückgabe eines Variablen-Typs T public T getData() { return this.data; } }
Ausgaberesultat
Die generische Klasse gibt zurück: 5 Die generische Klasse gibt zurück: Java Programing
In diesem Beispiel haben wir eine nach GenericsClass benannte generische Klasse erstellt. Diese Klasse kann für alle Arten von Daten verwendet werden.
class GenericsClass<T> {...}
Hier stellt T darTypparameterIm Inneren der Main-Klasse haben wir GenericsClass-Objekte mit den Namen intObj und stringObj erstellt.
Bei der Erstellung von intObj wird der Typparameter T durch Integer ersetzt. Dies bedeutet, dass intObj Daten mit GenericsClass verarbeitet.
Bei der Erstellung von stringObj wird der Typparameter T durch String ersetzt. Dies bedeutet, dass stringObj Daten mit GenericsClass verarbeitet.
Wie bei generischen Klassen können wir auch unsere eigenen generischen Methoden in Java erstellen.
class Main { public static void main(String[] args) { //Verwenden Sie Integer-Daten, um die Klasse zu initialisieren DemoClass demo = new DemoClass(); demo.<String>genericMethod("Java Programming"); } } class DemoClass { //Generische Methoden public <T> void genericsMethod(T data) { System.out.println("Dies ist eine generische Methode."); System.out.println("An die Methode übergebenen Daten sind "); + data); } }
Ausgaberesultat
Dies ist eine generische Methode. Die an die Methode übergebenen Daten sind: Java Programming
Im obigen Beispiel haben wir eine generische Methode genericsMethod in einer normalen Klasse (DemoClass) definiert.
public <T> void genericMethod(T data) {...}
Hier wird der Typparameter <T> zwischen dem Modifikator (public) und dem Rückgabetyp (void) eingefügt.
Wir können generische Methoden aufrufen, indem wir den tatsächlichen Typ <String> in Klammern vor dem Methodennamen platzieren.
demo.<String>genericMethod("Java Programming");
Beachten Sie:In den meisten Fällen können wir den Typparameter bei der Aufrufung eines generischen Methoden weglassen. Dies liegt daran, dass der Compiler den übergebenen Wert verwenden kann, um den Typparameter zu matchen. Zum Beispiel,
demo.genericsMethod("Java Programming");
In der Regel,Typparameterkann jeden Datentyp akzeptieren (außer Basistypen). Wenn wir jedoch nur Generics für bestimmte Typen verwenden möchten (z.B. Daten von Numeriktypen akzeptieren), können wir begrenzte Typen verwenden.
Wir verwenden den Schlüsselwort 'extends'. Zum Beispiel,
<T extends A>
Das bedeutet, dass T nur Untertypen von A akzeptieren kann.
class GenericsClass<T extends Number> { public void display() {}} System.out.println("This is a bounded type generics class."); } } class Main { public static void main(String[] args) { //Erstellen Sie ein Objekt der Klasse GenericsClass GenericsClass<String> obj = new GenericsClass<>(); } }
Im obigen Beispiel haben wir einebounded typesof the generic class. Hier beachten Sie den Ausdruck
<T extends Number>
Das bedeutet, dass T nur die Unterdatentypen von Number (Integer, Double usw.) verwenden kann.
Aber wir haben bereits ein Objekt der generischen Klasse mit String erstellt. Dies ist der Grund, warum wir den folgenden Fehler erhalten, wenn wir das Programm ausführen.
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
GenerischeEs ermöglicht uns, Code für verschiedene Datentypen zu schreiben. Zum Beispiel
public <T> void genericsMethod(T data) {...}
Hier erstellen wir eine generische Methode. Diese Methode kann zur Ausführung von Operationen mit Integer-Daten, String-Daten usw. verwendet werden.
GenerischeTypparameterGeben Sie Informationen über die Datentypen an, die in generischem Code verwendet werden.
Daher können Fehler bei der Kompilierung erkannt werden, was einfacher zu beheben ist als Fehler bei der Laufzeit. Zum Beispiel
//Ohne Generics NormalClass list = new NormalClass(); //Aufruf der Methode von NormalClass list.display("String");
Im obigen Code haben wir eine einfache Klasse. Wir rufen die Methode display() dieser Klasse auf, indem wir String-Daten übergeben.
Hier weiß der Compiler nicht, ob der übergebenen Wert im Parameter korrekt ist. Aber lassen Sie uns schauen, was passiert, wenn wir stattdessen generische Klassen verwenden.
//Generics verwenden GenericsClass<Integer> list = new GenericsClass<>(); //Aufruf von Methoden der Klasse GenericsClass list2.display("String"); Im obigen Code haben wir eine generische Klasse. Hier stellt der Typparameter dar, dass diese Klasse Integer-Daten verarbeitet. Daher wird ein Fehler durch den Compiler generiert, wenn Zeichenketten-Daten an die Parameter übergeben werden.
Das Kollisionsrahmen verwendet das Konzept der Generics in Java. Zum Beispiel,
// Erstellen Sie eine ArrayList vom Typ String ArrayList<String> list1 = new ArrayList<>(); // Erstellen Sie eine ArrayList vom Typ Integer ArrayList<Integer> list2 = new ArrayList<>();
Im obigen Beispiel haben wir die gleiche ArrayList-Klasse verwendet, um verschiedene Datenarten zu verarbeiten.
Ähnlich wie ArrayList, andere Kollektionen (LinkedList, Queue, Maps, usw.) sind auch Java-Generics.