English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java-Grundlagen-Tutorial

Java Kontrollfluss

Java Array

Java objektorientiert (I)

Java objektorientiert (II)

Java objektorientiert (III)

Java-Exception-Handhabung

Java Liste (Liste)

Java Queue (Warteschlange)

Java Map Sammlung

Java Set Sammlung

Java Eingabe-Ausgabe(I/O)

Java Reader/Writer

Andere Themen von Java

Java Generics

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.

Wie verwendet man Java-Generics

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.

Erstellen einer generischen Klasse

Nun, da wir wissen, wie Generics in Java funktionieren, schauen wir uns an, wie man seine eigenen generischen Klassen erstellt.

Beispiel: Erstellen einer generischen Klasse

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.

Erstellen Sie eine generische Methode

Wie bei generischen Klassen können wir auch unsere eigenen generischen Methoden in Java erstellen.

Beispiel: Erstellen Sie eine generische Methode

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");

bounded types

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.

Beispiel: Begrenzte Typen

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

Vorteile der Java-Generics

1. Wiederverwendbarkeit des Codes

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.

2. Typprüfung bei der Kompilierung

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.

3.Generics mit Kollektionen verwenden

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.