如何将类型清除列表转换为Kotlin中的数组?

函数toArray应该将类型清除的列表转换为现在是Array<String> T

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

但是, toArray会抛出这个错误。

java.lang.ClassCastException:[Ljava.lang.Object; 不能转换为[Ljava.lang.String;

你有什么想法吗?

这里的问题是,你实际上试图根据Java或者Array<Any>Array<String>来根据Kotlin将Object[]String[] ,但这是不同的对象。

所以,这个声明:

 list.toTypedArray() 

返回Array<Any?> ,然后尝试将其转换为Array<String>并获取ClassCastException

怎么修?

我建议通过类型参数本身,并强制List

 inline fun <reified T> toArray(list: List<*>): Array<T> { return (list as List<T>).toTypedArray() } toArray<String>(listOf("1", "2")) 
  1. 我建议挑战你需要将List<*>转换为类型化数组(例如Array<String> )而不是类型化列表(例如List<String> )。

    后者可以在Kotlin中很好地完成:

     list.map { it as String } 

    我建议阅读Kotlin和Java实践中的 列表和数组类型之间的区别 – >比较老的类更喜欢集合 。

  2. 如果您仍然觉得需要使用数组,那么我建议创建一个类似于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()) } } } } 

    然后,您可以高效地将List<*>转换为一个类型数组:

     list.mapToTypedArray { it as String }