Java Generische Programmierung

Was ist generische Programmierung?

Beim Programmieren möchte ich Klassen und Methoden mit mehreren Typen implementieren. Es ist zum Beispiel leicht zu erkennen, dass es lächerlich ist, ArrayList für int bzw. double für String zu implementieren. ArrrayList \ <T > ist ein Beispiel für generische Programmierung, da es Listen verschiedener Typparameter auf dieselbe Weise verarbeiten kann. Sehr nützlich. Das Erstellen einer Klasse oder Methode mit mehreren in \ <> eingeschlossenen Typparametern wie ArrayList \ <T > wird als generische Programmierung bezeichnet.

Verfassung

In diesem Artikel wird zunächst die grundlegende Implementierung und Verwendung von GenericClass und GenericMethod erläutert. Anschließend wird erläutert, wie Sie GenericPrograming einschränken und flexibel handhaben können. Abschließend werden die Punkte zusammengefasst, die bei GenericProgramming in Java zu beachten sind.

Generic Class Eine einfache Implementierung von Generic Class.

Entry.java


public class Entry<K, V>{ // point 1
  private K key;  // point 2
  private V value;

  public Entry(K key, V value){  // point 2
    this.key=key;
    this.value=value;
  }

  public K key(){return key;} // point 2
  public V value(){return value;}
}
  1. Deklarieren Sie beim Definieren einer Klasse mehrere Typparameter, die in \ <> nach dem Klassennamen eingeschlossen sind. K und V werden in Eintrag deklariert, K und V haben jedoch keine Bedeutung. Java-Konvention Verwenden Sie für den Typparameter in die Buchstaben T, E, K, V, X, R, U, T1, T2.
  2. Typparameter können als Rückgabetypen für Elementvariablen, Konstruktoren und Instanzmethoden verwendet werden.

Client.java


Entry<Integer, String> id = new Entry<String, Integer>(1001, "hitoshi watanabe"); //1
Entry<Integr, String> id2 = new Entry<>(1002, "taro yamada"); //2
var id3 = new Entry<Integer, String>(1003, "hideo kojima"); //3
  1. Dies ist der Prototyp.
  2. Wenn Sie auf der linken Seite einen Typparameter deklarieren, leitet der Compiler den Typparameter auf der rechten Seite ab. 3.2 Das Gegenteil von 2, der Schreibmethode, bei der der Compiler auf die linke Seite schließt.

Primitive Typen können nicht für Typparameter verwendet werden, daher werden anstelle von Ints Ganzzahlen in Kästchen verwendet.

Generic Method Typparameter sind instanzabhängig. Wenn Sie also Typparameter in einer statischen Methode verwenden möchten, müssen Sie Typparameter deklarieren, die von der Instanz unabhängig sind.

Arrays.java


public class Arrays {
  public static <T> void swap(T[] array, int i, int j){ // point 1
    T tmp = array[i];  //point 2
    array[i]=array[j];
    array[j]=tmp;
  }
}
  1. Geben Sie beim Deklarieren von GenericMethod den Typparameter mit \ <> vor dem Rückgabetyp an.
  2. Typparameter können in GenericMethod als Typen behandelt werden.

Client.java


String[] member = ...;
Arrays.<String>swap(member, 0, 1); //1
Arrays.swap(member, 0, 1); //2
  1. Dies ist der Prototyp
  2. Der Compiler leitet den Parameter swap type vom ersten Argumentelement ab

Allgemeine Programmierbeschränkungen

Ausreichend abstrakte Operationen wie Array.swap können einen Typparameter mit dem Namen \ <T > deklarieren, der den Typ nicht einschränkt. Wenn Sie jedoch restriktivere Operationen ausführen möchten, müssen Sie die Anforderungen an die Typparameter erfüllen. Es ist erforderlich, ein Limit festzulegen, damit nur Untertypen des Typs enthalten sind. Als Beispiel führen wir die Implementierung ein, wenn Sie alle Elemente schließen möchten, indem Sie ArrayList der Klasse verwenden, die die AutoClosable-Schnittstelle als Argument implementiert.

Sample1.java


public static <T extends AutoClosable> void closeAll(ArrayList<T> elems) throws Exception{ // point 1
  for(T e : elems) e.close(); // point 2
}
  1. Sie können Typparameter auf Any beschränken, das die Schnittstelle mit \ <Any erweitert interface / class > implementiert, oder Any, das die Klasse erbt. Daher kann diese generische Methode Typparameter nur zu einem Subtyp von AutoClosable machen.
  2. Da garantiert ist, dass der Typparameter dieser GenericMethod AutoClosable implementiert, kann die von AutoClosable bereitgestellte Methode close aufgerufen werden.

Wenn \ <T > deklariert wird, ergänzt der Compiler \ <T erweitert Object >. In Java haben alle Klassen eine Object-Klasse in ihren Vorfahren, sodass die von der Object-Klasse bereitgestellten Methoden verwendet werden können.

Die closeAll-Methode muss nicht GenericMethod sein

Sample.java


public static void closeAll(AutoClosable[] elems){
  for(AutoClosable e : elems) e.close();
}

##Erhöhte Flexibilität bei der generischen Programmierung
Wenn Sie eine Methode implementieren möchten, die eine Instanz mit einem Typparameter als Argument verwendet,Subtyp der Instanz, die als Argument verwendet werden soll,Es ist normal, Supertypen auch als Argumente zulassen zu wollen..jedoch,


#### **`BadSample.java`**
```java

public static void printName(ArrayList<Employee> staff){
  for(Employee e : staff) System.out.println(e.getName());
} 

BadSample.ArrayList als Argument wie JavaWann,Nur der Mitarbeitertyp ArrayList kann als Argument akzeptiert werden.Mit anderen Worten,ArrayList von Unterklasseninstanzen, die von Employee erben, kann mit dieser Methode nicht verwendet werden.Das ist nicht genug Flexibilität als Methode, deshalb verwenden wir das Konzept der WildCard.. Es gibt 3 Arten von Platzhaltern,Erklären Sie jeden.

###SubType WildCard BadSample.In Java konnte ich keine Klasse, die Employee geerbt hat, als Argument verwenden.,Der SubType-Platzhalter wird verwendet, um dieses Problem zu lösen..

Sample2.java


public static void printName(ArrayList<? extends Emplyee> staff){ // point 1
  for(Employee e : staff) System.out.println(e.getName());
}

<? extends hoge>Akzeptiert eine Instanz des Subtyp-Parameters von hoge als Argument.Der Hoge-Subtyp kann im Polymorphismus als Hoge behandelt werden.Zu jener Zeit,Wenn die verwendete Methode überschrieben wird,Die überschriebene Methode wird aufgerufen.

Recommended Posts

Java Generische Programmierung
Grundlagen der Java-Programmierung
Java generische Geschichte
Java-Programmiergrundlagen Übungsarray
Java-Programmierung (Klassenstruktur)
Programmiernotiz für Java-Wettbewerbe
Java Programming Thread Runnable
Erstaunliche Java-Programmierung (hören wir auf)
Java-Programmierung (Variablen und Daten)
Java Development Basics-Practice ③ Fortgeschrittene Programmierung-
Grundlagen der Java-Programmierung Practice-for-Anweisung
Java
Grundlagen der Java-Programmierung Practice-Switch-Anweisung
Java
[Java] Grundbegriffe der Programmierung
Wettbewerbsfähige Programmierung privater Spickzettel (Java)
Java Function Programming Exercise Book --zipWith-
Zusammenfassung der objektorientierten Programmierung mit Java
Java lernen (0)
Java studieren ―― 3
[Java] -Array
Java geschützt
[Java] Anmerkung
[Java] Modul
Java-Array
Java studieren ―― 9
Java Scratch Scratch
Java-Tipps, Tipps
Verwenden Sie OpenCV_Contrib (ArUco) mit Java! (Teil 2-Programmierung)
Java-Methoden
Java-Methode
Java (Konstruktor)
Java-Array
Java (überschreiben)
Java (Methode)
Java Day 2018
Java-Zeichenfolge
Objekt orientierte Programmierung
Java statisch
Java-Serialisierung
Java Anfänger 4
JAVA hat bezahlt
Java studieren ―― 4
Java (gesetzt)
[Java] compareTo
Java studieren -5
Newcomer-Training mit der Web-Basic-Programmierung mit Java-
Java reflektierend 获 获 举
Java (Schnittstelle)
Java-Memorandum
Java-Array
[Java] Array
Java # 0 studieren
Java-Überprüfung
Java-Framework
Java-Funktionen
[Java] Vererbung
FastScanner Java
Java-Funktionen