如何将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或者Array
为Array
来根据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"))
-
我建议挑战你需要将
List<*>
转换为types化数组(例如Array
)而不是types化列表(例如List
)。后者可以在Kotlin中很好地完成:
list.map { it as String }
我建议阅读Kotlin和Java实践中的 列表和数组types之间的区别 – >比较老的类更喜欢集合 。
-
如果您仍然觉得需要使用数组,那么我建议创建一个类似于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 }