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