当前位置: 首页 > 知识库问答 >
问题:

如何将类型擦除列表转换为静态编程语言中的数组?

空佐
2023-03-14

函数toArray应将类型擦除列表转换为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抛出此错误。

JAVAlang.ClassCastException:[Ljava.lang.Object;无法转换为[Ljava.lang.String;

你有什么想法吗?


共有3个答案

韩夕
2023-03-14

出于某种原因,我在尝试执行此操作时遇到无效参数编号异常:

val argumentTypeMirrors = mutableListOf<TypeMirror>()
... // add items to argumentTypeMirrors
val array = argumentTypeMirrors.toTypedArray()

最后我就这样做了:

val argumentTypeMirrors = mutableListOf<TypeMirror>()
... // add items to argumentTypeMirrors
val array = Array(argumentTypeMirrors.size) {
    argumentTypeMirrors[it]
}

然后,我可以使用*array解构我的数组,将其作为varargs参数传递。

郎宣
2023-03-14

为了理解为什么会发生这种情况,我建议阅读Kotlin和Java实践中列表和数组类型之间的差异-

一般来说,我建议使用列表而不是数组,但如果要将类型擦除列表转换为Kotlin中的数组,最简单的方法是首先映射到类型化列表,然后转换为类型化数组:

list.map { it as String }.toTypedArray()

如果您实际上不需要数组,但类型化列表就可以了,那么您可以简单地将类型擦除列表映射到类型化列表:

list.map { it as String }

如果您发现自己经常将类型擦除列表转换为数组,并且性能很重要,那么我建议您创建一个映射函数,该函数为此进行了优化,同时避免使用中间列表:

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.mapToTypedArray { it as String }

宋华美
2023-03-14

这里的问题是,您实际上试图以Java或数组的形式将Object[]转换为String[]

因此,这项声明:

list.toTypedArray()

返回数组

我建议传递类型参数本身,并强制转换List

inline fun <reified T> toArray(list: List<*>): Array<T> {
    return (list as List<T>).toTypedArray()
}

toArray<String>(listOf("1", "2"))

 类似资料:
  • 我的名单如下{(“a”,1),(“b”,2),(“c”,3),(“a”,4)} 我想将其转换为如下列表映射{("a"(1,4)),("b",(2)),("c",(3))} 也就是说,对于a,我们有一个1和4的列表,因为键是相同的。 Kotlin中如何将列表转换为地图中的答案?只显示唯一的价值(而不是像我一样的重复)。 我在Kotlin尝试了 但似乎不起作用。我怎样才能在 Kotlin 中做到这一点

  • 这两个代码片段有什么区别?以及如何决定使用哪一个? 和 有了这两个代码,我可以像这样通过索引访问它

  • 我正在尝试在Spring的TransactionTemplate上编写Kotlin包装器。关键代码如下所示: 代码无法编译。这是因为Java类TransactionCallback在Java中定义为: 在静态编程语言中解释为返回可空的T-,但我的方法返回。 如何更改此代码以使其可编译,同时允许调用方使用可为null的类型作为泛型类型? 我可以做这样的事情: 但是我的调用者将无法传递类型为

  • 我想在google api中更改我的标记。所以我在Picasso中使用了“getBitmap”功能,但此功能返回“位图?” .icon(位图描述符从位图(获取位图(user_URL[i])) - 所以,问题是: 类型不匹配错误(需要:位图,找到:位图?) java.lang.NullPointerException:图像在同一行中不能为空 我如何在科特林解决这个问题? 法典: 私人乐趣得到位图(网

  • 在将基于Java的模型类转换为静态编程语言后,我注意到我的setter和getter方法被删除了。曾经是什么, 成了 到底发生了什么?它是否移除了我的setters和getters,然后将变量的访问修饰符从private改为public?如果是,为什么以及如何是好的?Setters和getters是Java抽象的一部分。科特林不在乎这个? 我仍在学习 Kotlin,并且我依靠内置的转换作为最佳实践

  • 刚开始和Kotlin合作我很喜欢但是。。。我无法理解这种语言中的列表和数组。我对编程并不陌生,也不需要解释数组是什么。我不明白的是。 > 列表和数组之间有什么区别?它们看起来非常相似,您可以使用[索引]访问它们,也可以以几乎相同的方式使用它们。如果一个列表是不可变的,那么它们就更加相同了,所以。。。有什么区别?假设列表不是链表,它们都在O(1)访问时间内工作。 如果我使用列表;可变和不可变之间有什