gpt4 book ai didi

kotlin - 如何在 Kotlin 中创建一个用空值填充的通用数组?

转载 作者:IT老高 更新时间:2023-10-28 13:37:10 26 4
gpt4 key购买 nike

我试过了,代码没有编译。

class GenericClass<T>() {
private var arr : Array<T>? = null

{
arr = Array<T>(10, { null })
}
}

最佳答案

此代码中报告了两个编译器错误:一个是关于可空类型的,另一个是关于泛型的。

可为空的类型。 Kotlin 强制执行可空引用的规则,并且由于 T 可以用例如 String 使 arr 成为 Array 类型来实例化,因此编译器不允许您将空值放入该数组中。如果你想要空值,你必须将类型更改为数组:

class GenericClass<T>() {
private var arr : Array<T?>? = null

{
arr = Array(10, { null }) // No need to specify type arguments again
}
}

泛型。上面的例子仍然有一个编译时错误,因为我们试图构造一个未知类型 T 的数组。注意这个问题在 Java 中也存在。 Kotlin 被编译为 JVM 字节码需要两件事:

  • 泛型类型参数在运行时被删除,
  • 数组的通用参数除外。

这意味着在字节码中,Kotlin 必须创建一个具体类型的数组,而不是未知类型 T。它可以在看到 Array 时创建 Objects 数组,但这不起作用,例如,在这个案例:

fun test() {
fun foo(srts: Array<String?>) {
// ...
}
val gc = GenericClass<String>()
foo(gc.arr)
}

在这里,在最后一行中,我们试图将 Object[] 传递给预期 String[] 的地方,并得到一个运行时错误。

这就是 Kotlin 拒绝创建 T 数组的原因。您可以通过显式抑制类型系统来解决这个问题,即使用类型转换:

class GenericClass<T>() {
val arr : Array<T?>

{
arr = Array<Any?>(10, { null }) as Array<T?>
}
}

这里我们明确要求创建一个 Any 数组(编译为 Object[]),然后将其类型转换为一个 T 数组。编译器发出警告,但服从我们的意愿。

请注意,上面有问题的示例仍然存在,即如果您以这种方式创建的数组传递到预期的字符串数组,它将在运行时失败。

关于kotlin - 如何在 Kotlin 中创建一个用空值填充的通用数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20284326/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com