Comment faire pour convertir un type effacé de la liste à un tableau de Kotlin?
Une fonction toArray
doit convertir type effacé de la liste de T
qui est Array<String>
maintenant.
inline fun <reified T> toArray(list: List<*>): T {
return list.toTypedArray() as T
}
toArray<Array<String>>(listOf("a", "b", "c")) //should be arrayOf("a", "b", "c")
Cependant, toArray
génère cette erreur.
java.lang.ClassCastException: [Ljava.lang.Objet; ne peut pas être jeté à l' [Ljava.lang.Chaîne;
Avez-vous des idées?
OriginalL'auteur mmorihiro | 2016-12-24
Vous devez vous connecter pour publier un commentaire.
Problème ici, est que vous avez réellement tentez de fonte
Object[]
àString[]
en termes de Java, ouArray<Any>
àArray<String>
en termes de Kotlin, mais cela est différent des objets.Donc, cette déclaration:
retourne
Array<Any?>
, et puis vous essayez de le jeter auxArray<String>
et obtenirClassCastException
.Comment réparer?
Je suggère de passer de paramètre de type de lui-même, et jette
List
:inline fun <reified T> toArray(list: List<T>)
? Il vous permet d'économiser de l'décoché fonte, etT
peut également être déduit à partir du type d'argument.Uhm, et ce serait tout à fait équivalent à
.toTypedArray()
... 🙂Je ne peux pas changer la fonction de la signature.
OriginalL'auteur Ruslan
Je vous recommande de défier vos besoin pour convertir un
List<*>
à un tableau typé (par exempleArray<String>
) au lieu d'une liste tapée (par exempleList<String>
).Le plus tard peut être fait très bien dans Kotlin:
Je recommande la lecture de La différence entre la Liste et le Tableau de types de Kotlin et Java Pratiques -> Préfère les Collections plus anciennes classes.
Si vous vous sentez toujours que vous avez besoin de travailler avec des tableaux alors je vous recommande de créer une "carte" des fonctions semblables à Kotlin divers "carte" fonctions:
Vous pouvez ensuite convertir efficacement un
List<*>
à un tableau typé:OriginalL'auteur mfulton26
Pour une raison quelconque, j'ai été faire un argument invalide nombre exception lorsque j'ai essayé de faire ceci:
Et j'ai fini par le faire de cette façon:
Ensuite, j'ai été en mesure de détruire mon
array
avec*array
pour transmettre commevarargs
paramètre.OriginalL'auteur epool