Generische Arrays und das Geheimnis der Typlöschung
Bei der Arbeit mit Generika kann es verwirrend sein, warum einige Array-Deklarationen zulässig sind und andere nicht 'T. Bedenken Sie Folgendes:
ArrayList<Key> a = new ArrayList<Key>(); // Compiles fine
Dieser Code lässt sich ohne Probleme kompilieren. Wenn es jedoch um Arrays generischer Listen geht:
ArrayList<Key>[] a = new ArrayList<Key>[10]; // Compiler error
beschwert sich der Compiler. Warum ist das so?
Die Rolle der Typlöschung
Dieses Problem ergibt sich aus dem Konzept der Typlöschung in Java. Wenn ein generischer Typ kompiliert wird, werden seine Typparameter entfernt und durch Rohtypen ersetzt. Dies bedeutet, dass zur Laufzeit alle generischen Typen als ihre entsprechenden Rohtypen behandelt werden.
Im ersten Beispiel wird ArrayList
Allerdings ist ein Array eine andere Geschichte. Jedes Element eines Arrays muss denselben Typ haben. ArrayList
Behebung des Problems
Um das Problem zu beheben, kann man das Array in einen expliziten Rohtyp umwandeln:
ArrayList<Key>[] a = (ArrayList<Key> []) new ArrayList[10];
Diese Umwandlung teilt dem Compiler im Wesentlichen mit, dass wir ein Array von rohen ArrayList-Objekten benötigen, was ein gültiger Typ ist.
Verwendung verschachtelter Listen
Eine andere Möglichkeit besteht darin, eine Liste von Listen zu verwenden:
ArrayList<ArrayList<Key>> b = new ArrayList<ArrayList<Key>>();
In diesem Fall ist b eine Liste von ArrayList-Objekten, wobei jede ArrayList Elemente vom Typ Key enthalten kann. Dieser Ansatz ist legal, da ArrayList kein Array-Typ ist.
Zusätzliche Informationen
Weitere Einblicke in dieses Thema finden Sie in Kapitel 7.3 des offiziellen Java-Tutorials. Es erklärt, dass Array-Typen keine Typvariablen als Komponenten haben können, es sei denn, es handelt sich um Platzhaltertypen.
Das obige ist der detaillierte Inhalt vonWarum kann ich in Java kein Array generischer Listen erstellen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!