作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我试过了,代码没有编译。
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/
我是一名优秀的程序员,十分优秀!