Die verschiedenen Aufrufe an toArray
werden Arrays mit verschiedenen Komponententypen zurückgeben. Sie können dies sehen, indem Sie den folgenden Code ausführen:
List<String> list = new ArrayList<String>();
list.add("a");
List<String> list1 = Arrays.asList("a");
System.out.println(list.toArray().getClass());
System.out.println(list1.toArray().getClass());
Auf einer beliebigen Version von Java 8 oder früher, ist das Ergebnis
class [Ljava.lang.Object;
class [Ljava.lang.String;
Grundsätzlich ist dieser Ausgabemittel Object[]
und String[]
sind.
Dies ist jedoch ein Fehler. Siehe JDK-6260652. Obwohl es nicht sehr klar ist, Collection.toArray()
muss geben Sie eine Object[]
und nicht ein Array von einigen Untertypen von Object
zurück. Dafür gibt es mehrere Gründe.
Erstens wurde Collection.toArray()
in JDK 1.2 eingeführt, lange bevor Generika zur Sprache hinzugefügt wurden.Es gab keine Möglichkeit, dass eine Sammlungsimplementierung irgendetwas anderes als Object[]
zurücksendet. Aus Gründen der Kompatibilität müssen daher alle Implementierungen der Sammlungen toArray()
Object[]
zurückgeben.
Der zweite Grund ist, dass ein eher offhand Kommentar in der Spezifikation für toArray(T[])
sagt:
Beachten Sie, dass toArray (new Object [0]) in der Funktion toArray identisch ist().
die toArray()
erfordert wieder Object[]
und nicht eine Anordnung von einem anderen Typ zurückzukehren.
Dieser Fehler wurde in JDK wurde behoben 9. über das Code-Snippet Laufen auf einem aktuellen JDK 9 Build gibt die folgende Ausgabe:
class [Ljava.lang.Object;
class [Ljava.lang.Object;
Die Tatsache, dass Arrays.asList("a")
ein String[]
für interne Speicher verwendet, ist eine Implementierung Detail . Der Fehler, bei dem toArray()
etwas anderes als Object[]
zurückgegeben hat, ist dieses Implementierungsdetail, das herausgelaufen ist. (Tatsächlich wird das Array von der varargs-Maschinerie unter Verwendung des Typparameters der Methode als Array-Komponententyp erstellt. Arrays.asList()
umschließt einfach das Array.
Wie andere bereits gesagt haben, wenn Sie den Komponententyp steuern möchten von dem zurückgegebenen Array, verwenden Sie die andere Überlast toArray(T[])
:
String[] array = list.toArray(new String[0]);
String[] array1 = list1.toArray(new String[0]);
Vielen Dank für Ihre Erklärung. Ich überprüfte die Implementierung asList (T ...) in Arrays.java, es hält ein Array vom Typ T, während im Fall von ArrayList Fall Object [] verwendet wird. – hellrocker