Heim >Java >javaLernprogramm >Warum kann ich in Java keine generischen Arrays erstellen und welche sicheren Alternativen gibt es?
Die generische Funktion von Java ermöglicht die Erstellung typsicherer Container, steht jedoch vor Herausforderungen Umgang mit Arrays. Das Verständnis dieser Einschränkungen ist entscheidend, um unerwartete Fehler zu vermeiden.
Arrays weisen Kovarianz auf, was bedeutet, dass ein Array eines Supertyps Elemente eines Subtyps enthalten kann . Allerdings erzwingen Generika strengere Typprüfungen und lassen dieses Verhalten nicht zu, wodurch die Typsicherheit zur Kompilierungszeit gewährleistet wird.
Arrays Erzwingen Sie Typprüfungen zur Laufzeit mithilfe der Array Store Checking. Generics hingegen werden einer Typlöschung unterzogen, was bedeutet, dass Typinformationen zur Laufzeit verloren gehen. Dieser Unterschied führt zu unterschiedlichen Vorgängen bei der Arbeit mit Generika und Arrays.
Das Erstellen eines Arrays mit einem generischen Komponententyp ist aufgrund seiner verboten typunsicherer Natur. Betrachten Sie das folgende Beispiel:
public <T> T[] getArray(int size) { T[] arr = new T[size]; // Type-unsafe, not allowed return arr; }
Zur Laufzeit ist dieses Array tatsächlich ein Objekt[], dessen Typprüfung nicht korrekt erfolgt, wenn es einer Referenz von beispielsweise Integer[] zugewiesen wird.
Der Code E[] elements = (E[]) neues Objekt[10]; funktioniert aufgrund einer warnungsunterdrückenden Typumwandlung. Diese Problemumgehung ist jedoch nicht immer sicher und kann zu Laufzeitfehlern führen, insbesondere beim Umgang mit nicht vertrauenswürdigen Eingaben.
Array-Erstellung ist möglich Für unbegrenzte Platzhaltertypen zulässig, da sie reifizierbar sind, was bedeutet, dass sie einen Typparameter haben, der nicht angegeben ist. Dies ist sicher, da das Array Elemente jeden Typs enthalten kann.
Um ein Array sicher zu erstellen Verwenden Sie bei einem generischen Komponententyp Array.newInstance(). Diese Methode verwendet das Klassenobjekt des Komponententyps und die gewünschte Array-Größe als Parameter.
public <E> E[] getArray(Class<E> clazz, int size) { @SuppressWarnings("unchecked") E[] arr = (E[]) Array.newInstance(clazz, size); return arr; }
Durch das Verständnis dieser Einschränkungen und die Verwendung der empfohlenen Problemumgehung können Java-Entwickler Generika und Arrays effektiv handhaben und gleichzeitig die Typsicherheit gewährleisten.
Das obige ist der detaillierte Inhalt vonWarum kann ich in Java keine generischen Arrays erstellen und welche sicheren Alternativen gibt es?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!