¿Cómo convertir una list borrada por types a una matriz en Kotlin?

Una function para toArray debería convertir la list borrada por tipo en T que ahora es Array<String> .

 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") 

Sin embargo, toArray arroja este error.

java.lang.ClassCastException: [Ljava.lang.Object; no se puede convertir a [Ljava.lang.String;

¿Tienes alguna idea?

El problema aquí es que realmente intentas lanzar Object[] a String[] en términos de Java, o Array<Any> a Array<String> en términos de Kotlin, pero se trata de objects diferentes.

Entonces, esta statement:

 list.toTypedArray() 

devuelve Array<Any?> , y luego intenta convertirlo en Array<String> y obtiene ClassCastException .

¿Como arreglar?

Sugiero el parámetro de tipo de pase en sí mismo, y List lanzamiento:

 inline fun <reified T> toArray(list: List<*>): Array<T> { return (list as List<T>).toTypedArray() } toArray<String>(listOf("1", "2")) 
  1. Recomiendo cuestionar su necesidad de convertir una List<*> a una matriz escrita (por ejemplo, Array<String> ) en lugar de una list escrita (por ejemplo, List<String> ).

    Lo posterior se puede hacer muy bien en Kotlin:

     list.map { it as String } 

    Recomiendo leer Diferencia entre los types de Lista y Matriz en Kotlin y Prácticas de Java -> Preferir collections sobre classs más antiguas .

  2. Si todavía siente que necesita trabajar con matrices, le recomiendo que cree una function de "map" similar a las diversas funciones de "map" de Kotlin:

     inline fun <T, reified R> List<T>.mapToTypedArray(transform: (T) -> R): Array<R> { return when (this) { is RandomAccess -> Array(size) { index -> transform(this[index]) } else -> with(iterator()) { Array(size) { transform(next()) } } } } 

    A continuación, puede convertir de manera eficiente una List<*> a una matriz con text:

     list.mapToTypedArray { it as String } 
  • Función Kotlin Array init
  • Arreglo 2D en Kotlin
  • Array Int bidimensional en Kotlin
  • Kotlin: Colección genérica a matriz genérica
  • indexOf en Matrices de Kotlin
  • Inicializando matrices en kotlin
  • Acoplar arreglo en Kotlin
  • ¿Cómo crear una matriz vacía en kotlin?
  • Kotlin - Cómo convertir String a ByteArray
  • Kotlin equivalente para el set de classs de C ++
  • ¿Cómo implementar readLine () !!. ToIntArray () en Kotlin?