Java: (Zeichenfolge[])List.toArray() gibt ClassCastException

Lesezeit: 3 Minuten

Der folgende Code (in Android ausgeführt) gibt mir immer eine ClassCastException in der 3. Zeile:

final String[] v1 = i18nCategory.translation.get(id);
final ArrayList<String> v2 = new ArrayList<String>(Arrays.asList(v1));
String[] v3 = (String[])v2.toArray();

Es passiert auch, wenn v2 Object ist[0] und auch wenn Strings drin sind. Irgendeine Idee warum?

  • Vielleicht möchten Sie etwas über Kovarianz und Kontravarianz lesen — de.wikipedia.org/wiki/…

    – Hut8

    17. April 11 um 1:35 Uhr

  • Was ist mit dem Fall, in dem T eine Schnittstelle mit einer Factory-Methode zur Instanziierung ist?

    – sebaj

    7. September 11 um 3:34 Uhr

  • @LaceCard – dies hängt nur sehr indirekt mit Kovarianz / Kontravarianz zusammen. Das eigentliche Problem ist, dass dies eine direkte Folge des angegebenen Verhaltens von ist toArray() Methode.

    – Stefan C

    3. August 13 um 2:21 Uhr

Java ZeichenfolgeListtoArray gibt
MeBigFatGuy

Dies liegt daran, wenn Sie verwenden

 toArray() 

es gibt ein Objekt zurück[], die nicht in einen String umgewandelt werden kann[] (obwohl der Inhalt Strings sind) Dies liegt daran, dass die toArray-Methode nur a erhält

List 

und nicht

List<String>

da Generika nur Quellcode sind und zur Laufzeit nicht verfügbar sind und daher nicht bestimmen können, welche Art von Array erstellt werden soll.

benutzen

toArray(new String[v2.size()]);

die die richtige Art von Array (String[] und in der richtigen Größe)

  • @ Kaleb – stimmt nicht. Oder zumindest ist das nicht der ursprüngliche Grund. Der toArray Methoden existierten, bevor die Sammlungsklassen generisch waren.

    – Stefan C

    16. April 11 um 23:38 Uhr

  • Dies ist die richtige Lösung, aber nicht die richtige Erklärung. Du kannst Objekt nicht wirken[] verdoppeln[] weil es eine Sprachfunktion ist, mehr nicht. Das hat nichts mit Generika zu tun. Sie können Object to Double wirken, vorausgesetzt, es handelt sich wirklich um ein Double. Logischerweise könnten Sie dasselbe mit einem Array machen, aber es ist einfach nicht Teil der Sprache. Wenn Sie Object to Double casten, wird eine Laufzeitprüfung durchgeführt, um sicherzustellen, dass Object tatsächlich ein Double IST. Wenn Sie Double in Object umwandeln, erfolgt keine Laufzeitprüfung, da sich Object in der Vererbungshierarchie von Double befindet.

    – KyleM

    7. März 13 um 17:52 Uhr

  • Wenn ich dies in IntelliJ mache, erhalte ich eine Warnung zur Verwendung toArray(new String[0]) vielmehr: „In älteren Java-Versionen wurde die Verwendung eines vorkonfigurierten Arrays empfohlen, da der Reflexionsaufruf, der zum Erstellen eines Arrays mit der richtigen Größe erforderlich ist, ziemlich langsam war. Seit späten Updates von OpenJDK 6 war dieser Aufruf jedoch intrinsisch, wodurch die Leistung leer wurde Array-Version die gleiche und manchmal sogar besser.Auch das Passieren von vorgefertigten Arrays ist gefährlich für eine gleichzeitige Sammlung, da ein Rennen zwischen den möglich ist size und toArray Anruf.”

    – Mikepote

    7. August 19 um 12:20 Uhr

1644074885 172 Java ZeichenfolgeListtoArray gibt
Dilum Ranatunga

Sie verwenden das Falsche toArray()

Denken Sie daran, dass die Generika von Java hauptsächlich syntaktischer Zucker sind. Eine ArrayList weiß nicht wirklich, dass alle ihre Elemente Strings sind.

Rufen Sie an, um Ihr Problem zu beheben toArray(T[]). In Ihrem Fall,

String[] v3 = v2.toArray(new String[v2.size()]);

Beachten Sie, dass die generische Form toArray(T[]) kehrt zurück T[], sodass das Ergebnis nicht explizit umgewandelt werden muss.

1644074885 643 Java ZeichenfolgeListtoArray gibt
Hoffentlich Hilfreich

String[] v3 = v2.toArray(new String[0]); 

macht auch den Trick, beachten Sie, dass Sie nicht einmal mehr umwandeln müssen, sobald der Methode der richtige ArrayType gegeben wurde.

1644074886 499 Java ZeichenfolgeListtoArray gibt
MakNe

String[] str = new String[list.size()];
str = (String[]) list.toArray(str);

Verwenden Sie so.

Verwenden toArray von dem JDK 11 Stream-API, können Sie das allgemeinere Problem folgendermaßen lösen:

Object[] v1 = new String[] {"a", "b", "c"}; // or array of another type
String[] v2 = Arrays.stream(v1)
    .<String>map((Object v) -> v.toString()).toArray(String[]::new);

.

784800cookie-checkJava: (Zeichenfolge[])List.toArray() gibt ClassCastException

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy