Le code suivant (exécuté sous Android) me donne toujours une ClassCastException dans la 3ème ligne:
final String[] v1 = i18nCategory.translation.get(id);
final ArrayList<String> v2 = new ArrayList<String>(Arrays.asList(v1));
String[] v3 = (String[])v2.toArray();
Cela se produit également lorsque v2 est Object [0] et également lorsqu'il contient des chaînes. Une idée pourquoi?
java
list
classcastexception
toarray
Gavriel
la source
la source
toArray()
méthode.Réponses:
C'est parce que lorsque vous utilisez
il renvoie un Object [], qui ne peut pas être converti en String [] (même si le contenu est des Strings) C'est parce que la méthode toArray n'obtient qu'un
et pas
car les génériques ne sont qu'un code source et ne sont pas disponibles au moment de l'exécution et ne peuvent donc pas déterminer le type de tableau à créer.
utilisation
qui alloue le bon type de tableau (String [] et de la bonne taille)
la source
toArray
méthodes existaient avant que les classes de collection ne soient génériques.toArray(new String[0])
plutôt: "Dans les anciennes versions de Java, l'utilisation d'un tableau pré-dimensionné était recommandée car l'appel de réflexion nécessaire pour créer un tableau de taille appropriée était assez lent. Cependant, depuis les dernières mises à jour d'OpenJDK 6 cet appel était intrinsèque, rendant les performances de la version de tableau vide les mêmes et parfois même meilleures. Le passage d'un tableau pré-dimensionné est également dangereux pour une collection concurrente car une course est possible entre l' appelsize
ettoArray
. "Vous utilisez le mauvais
toArray()
N'oubliez pas que les génériques de Java sont principalement du sucre syntaxique. Un ArrayList ne sait pas réellement que tous ses éléments sont des chaînes.
Pour résoudre votre problème, appelez
toArray(T[])
. Dans ton cas,Notez que le formulaire générique est
toArray(T[])
renvoyéT[]
, le résultat n'a donc pas besoin d'être explicitement converti.la source
fait également l'affaire, notez que vous n'avez même plus besoin de lancer un cast une fois que le bon ArrayType est donné à la méthode.
la source
Utilisez comme ça.
la source