java generic array how simulate generic arrays java
In diesem Tutorial wird erläutert, wie Sie die Funktionalität eines generischen Arrays in Java mithilfe des Objektarrays und der Reflektionsklasse anhand eines einfachen Beispiels simulieren:
Wir haben bereits diskutiert Java-Generika in einem unserer vorherigen Tutorials. Java erlaubt generische Klassen, Methoden usw., die unabhängig von Typen deklariert werden können. Java erlaubt jedoch nicht, dass das Array generisch ist.
Der Grund dafür ist, dass Arrays in Java Informationen zu ihren Komponenten enthalten und diese Informationen zur Zuweisung von Speicher zur Laufzeit verwendet werden. Wenn Generika verwendet werden, enthält der Bytecode aufgrund der Typlöschung keine generischen Informationen.
=> Besuchen Sie hier, um Java von Grund auf neu zu lernen.
Was du lernen wirst:
Generisches Array in Java
Wenn Sie ein generisches Array definiert haben, ist der Komponententyp zur Laufzeit nicht bekannt. Daher ist es nicht ratsam, Arrays in Java als generisch zu definieren.
Eine generische Array-Definition lautet wie folgt:
E () newArray = new E(length);
Der Compiler kennt den genauen Typ, der instanziiert werden soll, nicht, da die Typinformationen zur Laufzeit nicht verfügbar sind.
Anstelle von Arrays sollten Sie daher immer dann, wenn Generika erforderlich sind, die Listenkomponente des Java Collections-Frameworks bevorzugen. Sie können jedoch generische Strukturen erstellen, die Array-ähnlich sind, indem Sie das Objektarray und die Reflexionsfunktion von Java verwenden.
Diese beiden Ansätze, mit denen wir Arrays unterschiedlicher Datentypen definieren können, werden im Folgenden ausführlich erläutert.
Sortierquellcode c ++ zusammenführen
Erstellen und initialisieren Sie das generische Array
In diesem Abschnitt erstellen wir eine Array-ähnliche Struktur, die generischer Natur ist. Mithilfe dieser Strukturen können Sie Arrays erstellen, indem Sie den Datentyp als Argument angeben.
Verwenden des Objektarrays
Dieser Ansatz verwendet das Array vom Typ Objekte als Mitglied der Hauptarrayklasse. Wir verwenden auch get / set-Methoden, um die Array-Elemente zu lesen und festzulegen. Anschließend instanziieren wir die Hauptarrayklasse, mit der wir den Datentyp nach Bedarf bereitstellen können.
Dies simuliert das generische Array.
Das folgende Programm demonstriert die Verwendung von Objektarrays zum Erstellen einer generischen Array-ähnlichen Struktur.
import java.util.Arrays; class Array { private final Object() obj_array; //object array public final int length; // class constructor public Array(int length) { // instantiate a new Object array of specified length obj_array = new Object (length); this.length = length; } // get obj_array(i) E get(int i) { @SuppressWarnings('unchecked') final E e = (E)obj_array(i); return e; } // set e at obj_array(i) void set(int i, E e) { obj_array(i) = e; } @Override public String toString() { return Arrays.toString(obj_array); } } class Main { public static void main(String() args){ final int length = 5; // creating integer array Arrayint_Array = new Array(length); System.out.print('Generic Array :' + ' '); for (int i = 0; i Ausgabe:
Im obigen Programm haben wir ein generisches Klassenarray definiert. Das Objektarray ist ein Mitglied der Klasse, die mithilfe eines Konstruktors und einer Länge instanziiert wird. Wir verwenden auch die generischen Methoden get und set, mit denen ein Array-Element eines bestimmten Typs gelesen und festgelegt wird.
Dann erstellen wir Instanzen dieser Array-Klasse. Beim Erstellen von Instanzen können wir den gewünschten Typ angeben. Im obigen Programm haben wir zwei Arrays vom Typ Integer und String erstellt und diese Arrays dann mit geeigneten Werten gefüllt (unter Verwendung der set-Methode).
Schließlich zeigen wir mit der überschriebenen Methode 'toString' den Inhalt jeder dieser Instanzen an.
Reflexion verwenden
Bei diesem Ansatz verwenden wir eine Reflektionsklasse, um ein generisches Array zu erstellen, dessen Typ nur zur Laufzeit bekannt ist.
Der Ansatz ähnelt dem vorherigen mit nur einem Unterschied, d. H. Wir verwenden die Reflexionsklasse im Konstruktor selbst, um ein Objektarray zu instanziieren, indem wir die Datentypinformationen explizit an den Klassenkonstruktor übergeben.
j2ee Interviewfragen für leitende Entwickler
Diese Art von Informationen wird an die Reflexionsmethode Array.newInstance übergeben.
Das folgende Programm zeigt die Verwendung von Reflektion zum Erstellen eines generischen Arrays . Beachten Sie, dass die gesamte Programmstruktur dem vorherigen Ansatz ähnelt, nur mit dem Unterschied in der Verwendung von Reflexionsfunktionen.
importjava.util.Arrays; class Array { private final E() objArray; public final int length; // class constructor public Array(ClassdataType, int length){ // create a new array with the specified data type and length at runtime using reflection this.objArray = (E()) java.lang.reflect.Array.newInstance(dataType, length); this.length = length; } // get element at objArray(i) Eget(int i) { returnobjArray(i); } // assign e to objArray(i) void set(int i, E e) { objArray(i) = e; } @Override public String toString() { return Arrays.toString(objArray); } } class Main { public static void main(String() args){ final int length = 5; // create array with Integer as data type Arrayint_Array = new Array(Integer.class, length); System.out.print('Generic Array:' + ' '); for (int i = 0; i Ausgabe:
Das obige Programm zeigt Arrays von zwei Typen, d. H. Integer und String, die aus der generischen Klasse Arrays erstellt wurden.
Generic Array Creation Error
Wir haben bereits die Auswirkungen der Erstellung generischer Arrays in Java erörtert und warum es nicht möglich ist, generische Arrays in Java zu haben. Eine weitere Erklärung dafür ist, dass Arrays in Java kovariant sind, Generika hingegen nicht. Generika sind unveränderlich.
Mit Kovarianz meinen wir, dass ein Array des Subtyps seiner Supertypreferenz zugewiesen werden kann.
Dies bedeutet, dass die folgende Anweisung gut funktioniert.
Number numArray() = new Integer(10);
Da Integer ein Subtyp von Number ist, wird die obige Anweisung gut kompiliert.
Wenn wir jedoch dasselbe Konzept mit Generika verwenden, funktioniert es nicht, d. H. Mit Generika können wir einem generischen Supertyp keinen Subtyp generisch zuweisen.
Die Anweisung ListobjList = new ArrayList (); gibt einen Kompilierungsfehler aus, da Generika nicht wie Arrays kovariant sind.
Unter Berücksichtigung des oben genannten Grundes können wir auch nicht so etwas wie das Folgende haben:
public static ArrayList() myarray = new ArrayList(2);
Diese Anweisung kann nicht mit dem Fehler kompiliert werden. 'Generische Array-Erstellung' da wir kein Array von Verweisen auf einen bestimmten generischen Typ deklarieren können.
Wir können jedoch mithilfe von Platzhaltern ein Array von Verweisen auf einen bestimmten generischen Typ erstellen. Die obige Anweisung kann mit einer geringfügigen Änderung der Verwendung eines Platzhalters wie unten gezeigt erfolgreich kompiliert werden.
public static ArrayListmyarray = new ArrayList(5);
Die obige Anweisung wird erfolgreich kompiliert.
Das folgende Programm zeigt eine Demonstration der Verwendung von Platzhaltern.
Was ist Dev C ++
import java.util.*; //generic array class classArr { T tarray(); Arr(T myarray()) { tarray = myarray; } @Override public String toString() { return Arrays.toString(tarray); } } public class Main { public static void main(String() args) { // Arrtarray() = new Arr(5); //error: generic array creation //initialize new array objects Arr arr1 = new Arr(new Integer(){2,4,6,8,10}); System.out.print('Array with Integer type:' + ' '); System.out.println(arr1); Arr arr2 = new Arr(new String(){'aa', 'bb', 'cc', 'dd'}); System.out.print('Array with String type:' + ' '); System.out.println(arr2); //define array objects using wildcard Arrarr3() = new Arr(5); arr3(0) = new Arr(new Integer(){10, 20, 30, 40, 50}); System.out.println('Integer array: ' + arr3(0)); arr3(1) = new Arr(new Float(){1.1f, 2.2f, 3.3f, 4.4f, 5.5f}); System.out.println('Float array: ' + arr3(1)); } }
Ausgabe:
Im obigen Programm haben wir die erste Anweisung in der Hauptmethode, die die Invarianz von Generika angibt. Diese Anweisung blinkt den Kompilierungsfehler (in den Kommentaren gezeigt). Die nächste Array-Erstellung erfolgt nach den Regeln der Generika und wird daher erfolgreich kompiliert.
Häufig gestellte Fragen
F # 1) Was ist ein generisches Array?
Antworten: Arrays, die vom Datentyp unabhängig sind und deren Informationstyp zur Laufzeit ausgewertet wird, sind generische Arrays. Generika ähneln Vorlagen in C ++.
F # 2) Können Sie ein generisches Array in Java erstellen?
Antworten: Arrays sind in Java kovariant, d. H. Jedes Unterklassenarray kann einem Supertyparray zugewiesen werden. Generika sind jedoch unveränderlich, d. H. Sie können dem Oberklassentyp kein Array vom Typ Unterklasse zuweisen.
Zweitens werden die generischen Informationen aus der JVM entfernt, und daher weiß das Array, dessen Speicherzuweisung zur Laufzeit erfolgt, nicht, welcher Typ dem Array zugewiesen werden soll. Daher passen Arrays und Generika in Java nicht gut zusammen.
F # 3) Was ist Typ E in Java?
Antworten: fungiert als Platzhalter für Generika und repräsentiert jede Art von Element.
F # 4) Was ist Type Erasure in Java?
Antworten: Ein vom Java-Compiler ausgeführter Prozess, bei dem die in Generika verwendeten parametrisierten Typen entfernt und im Bytecode den Rohtypen zugeordnet werden. Daher enthält der Bytecode keine Informationen zu Generika.
F # 5) Was ist ein Raw-Typ in Java?
Antworten: Rohtypen sind generische Typen ohne Verwendung des Typparameters. Z.B. Liste ist ein Rohtyp; List ist ein parametrisierter Typ.
Fazit
In Java kann das generische Array nicht direkt definiert werden, d. H. Sie können keinen parametrisierten Typ einer Arrayreferenz zuweisen. Mithilfe von Objektarrays und Reflexionsfunktionen können Sie jedoch die generische Arrayerstellung simulieren.
Wir haben diese beiden Ansätze in diesem Lernprogramm zusammen mit den Details des generischen Array-Erstellungsfehlers und den Möglichkeiten, einen solchen Fehler zu verhindern, gesehen. Kurz gesagt, in Java können Sie sagen, dass Arrays und Generika nicht Hand in Hand gehen, da Arrays kovariant und Generika unveränderlich sind.
=> Lesen Sie hier den perfekten Java-Schulungsleitfaden.
Literatur-Empfehlungen
- Java Array - Wie drucke ich Elemente eines Arrays in Java?
- Java Array Length Tutorial mit Codebeispielen
- Java Reflection Tutorial mit Beispielen
- Java-Array - Deklarieren, Erstellen und Initialisieren eines Arrays in Java
- Einführung in Java-Arrays und verwandte Konzepte
- Java Generics Tutorial mit Beispielen
- Java SWING Tutorial: Container-, Komponenten- und Ereignisbehandlung
- Java DataTypes, Loops, Arrays, Switch und Assertions