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

函数toArray应该将types清除的列表转换为现在是Array T

 inline fun  toArray(list: List): T { return list.toTypedArray() as T } toArray<Array>(listOf("a", "b", "c")) // should be arrayOf("a", "b", "c") 

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

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

你有什么想法?

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

所以,这个声明:

 list.toTypedArray() 

返回Array ,然后尝试将其转换为Array并获取ClassCastException

怎么修?

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

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

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

     list.map { it as String } 

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

  2. 如果您仍然觉得需要使用数组,那么我建议创建一个类似于Kotlin的各种“地图”function的“地图”function:

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

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

     list.mapToTypedArray { it as String }