Während Sie eine Array-Referenz mit einem generischen Typ (E[]-Elemente) erstellen können, erstellen Sie ein Array-Objekt mit einem generischen Typ ( elements = new E[10]) ist verboten. Dies ist auf grundlegende Unterschiede in der Art und Weise zurückzuführen, wie Generika und Arrays die Typerzwingung handhaben.
Im Gegensatz zu Generika sind Arrays kovariant. Dies bedeutet, dass ein Array eines Supertyps (z. B. Object[]) einem Array eines Subtyps (z. B. String[]) zugewiesen werden kann. Dies ist bei Generika nicht der Fall, die Invarianz erzwingen (z. B. kann List
Generika erzwingen stärkere Typprüfungen zur Kompilierungszeit , um Laufzeitausnahmen zu verhindern und die Typsicherheit zu wahren. Arrays enthalten jedoch Laufzeittypinformationen, was zu potenziellen ArrayStoreExceptions führen kann, wenn ein Element eines inkompatiblen Typs eingefügt wird.
Erstellen eines Arrays mit einem generischen Komponententyp (z. B. , T[]) ist unsicher, da der Typ zur Laufzeit nicht bekannt ist. Dies kann zu Typumwandlungsfehlern oder ArrayStoreExceptions führen, da das erstellte Array möglicherweise tatsächlich ein getarntes Object[] ist.
Sie fragen sich vielleicht, warum elements = (E[]) new Object[10] scheint zu funktionieren. Dies liegt an der ungeprüften Typumwandlung, die Warnungen zur Kompilierungszeit unterdrückt, aber dennoch das Risiko von Laufzeitausnahmen birgt. In diesem Fall kann die Umwandlung erfolgreich sein, wenn die Array-Elemente mit dem generischen Typ kompatibel sind, aber es funktioniert möglicherweise nicht immer.
Um ein Array eines generischen Typs zu erstellen Geben Sie ein, ohne auf ungeprüftes Casting angewiesen zu sein, verwenden Sie die Methode Array#newInstance():
public <E> E[] getArray(Class<E> clazz, int size) { @SuppressWarnings("unchecked") E[] arr = (E[]) Array.newInstance(clazz, size); return arr; }
Das Erstellen eines Arrays von durch Platzhalter parametrisierten Typen (z. B. List>[]) ist zulässig, da Platzhalter veränderbare Typen sind, die ihre Parametrisierung zur Laufzeit beibehalten. Beispielsweise entspricht List>[] List[].
Das obige ist der detaillierte Inhalt vonWarum können Sie generische Arrays in Java nicht direkt erstellen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!