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.
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;}
}
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
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;
}
}
Client.java
String[] member = ...;
Arrays.<String>swap(member, 0, 1); //1
Arrays.swap(member, 0, 1); //2
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
}
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 Java
###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