Gibt es eine generische Version von Array.newInstance?

8

Ich habe festgestellt, dass in% Array.newInstance() von% Object anstatt von T[] zurückgibt. Es ist verständlich, dass diese Methode eingeführt wurde, bevor Java generische Typen unterstützt.

Es ist jedoch eine Überraschung, dass es keine gleichwertige generische Version davon gibt. Das Arrays.copyOf von Java 7 ist nicht dasselbe - es kopiert den Inhalt des Parameters, anstatt ein neues Dummy-Array zu erstellen (mit allen Null-Objekten darin).

Da dies scheinbar trivial ist, gibt es irgendeinen Grund, es nicht in die JRE zu integrieren? oder ich kann einfach keinen finden?

AKTUALISIEREN

Es scheint, dass ich meine eigene "triviale" Implementierung bereitstellen werde, um die Frage nicht zu missverstehen.

%Vor%

Ich poste diesen Code nicht als Antwort, weil es nicht die Antwort auf die Frage ist. Die Frage bezieht sich auf Grund und / oder bestehenden Code, nicht auf die Implementierung.

AKTUALISIEREN

Ich habe den Code aktualisiert, um ihn mit Arrays.copyOf zu vergleichen, und der Vorteil ist, dass der Programmierer einfach den Typ des Parameters ändern kann, um den Code für einen anderen Typ anzupassen. Außerdem habe ich die Verwendung von Array.newInstance für primitive Typen eliminiert.

    
Earth Engine 19.07.2013, 02:57
quelle

3 Antworten

7

Guava bietet so eine Funktion . Es ist nicht das erste Mal, dass Guava (oder Apache Commons) einen häufig verwendeten Helfer zur Verfügung stellt, den das JDK aus irgendeinem Grund nicht hat.

Das wissen Sie vielleicht, aber ein Hintergrund für den Googler, der in Zukunft darüber stolpert: Der Grund, warum die Signatur nicht generisch gemacht werden kann, ist, dass die Methode Array.newInstance reputed Object in Java 1.4 , aus Gründen der Abwärtskompatibilität sollte daher auch die rohe Version der Methode verwendet werden Rückgabe Code%. Wenn es wie folgt generalisiert wurde:

%Vor%

... dann wäre der Rückgabetyp Object , nicht Object[] . Dies würde die Abwärtskompatibilität zerstören, die die Java-Designer immer sehr bemüht haben.

Die Methoden Object kamen nur mit Java 1.6 und mussten sich daher keine Gedanken über die Abwärtskompatibilität machen.

    
yshavit 19.07.2013, 05:04
quelle
4

Nein, Sie müssen den konkreten Typ als Parameter auf die eine oder andere Weise übergeben. Wie Sie bereits erwähnt haben, zeigt Arrays.copyOf dies in Aktion.

%Vor%     
pstanton 19.07.2013 03:15
quelle
3

Der Grund, warum Array.newInstance() nicht wie <T> T[] newInstance(Class<T> class, int size) deklariert werden kann, liegt daran, dass damit Arrays von Primitiven erstellt werden können. Wenn Sie zum Beispiel int.class mit dem Typ Class<Integer> übergeben, erwarten Sie von der Deklaration, dass sie ein Objekt Integer[] zurückgibt. Die Funktion gibt jedoch tatsächlich ein Objekt int[] zurück, das kein Untertyp von Integer[] ist, daher hat es den falschen Typ.

Sicher, sie könnten eine zusätzliche Methode wie newReferenceArrayInstance() hinzufügen, die primitive Typen verbietet (z. B. eine Ausnahme beim Übergeben eines primitiven Typs auslöst) und somit sicher deklariert werden kann, um T[] zurückzugeben. Dies scheint jedoch so zu sein, als würde man eine vollständig redundante Methode hinzufügen, um eine ungeprüfte Umwandlung zu vermeiden.

    
newacct 19.07.2013 22:17
quelle

Tags und Links