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?
![Java: (Zeichenfolge[])List.toArray() gibt ClassCastException 1 Java ZeichenfolgeListtoArray gibt](https://www.viresist.org/wp-content/uploads/Java-ZeichenfolgeListtoArray-gibt-ClassCastException.png)
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)
![Java: (Zeichenfolge[])List.toArray() gibt ClassCastException 2 1644074885 172 Java ZeichenfolgeListtoArray gibt](https://www.viresist.org/wp-content/uploads/1644074885_172_Java-ZeichenfolgeListtoArray-gibt-ClassCastException.png)
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.
![Java: (Zeichenfolge[])List.toArray() gibt ClassCastException 3 1644074885 643 Java ZeichenfolgeListtoArray gibt](https://www.viresist.org/wp-content/uploads/1644074885_643_Java-ZeichenfolgeListtoArray-gibt-ClassCastException.png)
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.
![Java: (Zeichenfolge[])List.toArray() gibt ClassCastException 4 1644074886 499 Java ZeichenfolgeListtoArray gibt](https://www.viresist.org/wp-content/uploads/1644074886_499_Java-ZeichenfolgeListtoArray-gibt-ClassCastException.png)
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);
.
7848000cookie-checkJava: (Zeichenfolge[])List.toArray() gibt ClassCastExceptionyes
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