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.
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:
... 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.
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.