为什么 Kotlin 的 null 安全性不能与局部变量初始化器一起正常工作?

2024-01-02

请看这段代码:

fun localVarNullSafety1(){
    var number: Double? = 3.0

    val sum = 2.0 + number // does not compile (Type mismatch: inferred type is Double? but Double was expected)
}

fun localVarNullSafety1(){
    var number: Double? = null
    
    number = 3.0

    val sum = 2.0 + number // compiles fine
}

我认为上面的代码由语义上相同的函数组成 - 局部变量不会超出范围,并且它们对于执行线程来说是本地的。在我看来,第一个函数没有理由不编译。

我认为 Kotlin 的智能转换应该考虑变量初始化。

我错过了一些明显的事情吗?


这在中讨论过KT-13663 https://youtrack.jetbrains.com/issue/KT-13663/Smartcast-variable-declaration-from-initializer-of-different-typ,并且在撰写本文时它仍然是一个开放的票证。

他们正在考虑更一般的情况(请注意T?是一个超类型T):

 val x: Supertype = Subtype()
 var y: Supertype = Subtype()

并决定在val这种情况,没有意义x有类型Subtype在这里,否则你一开始就不能写类型注释。

这对于var虽然如此,但如果智能转换仅实现vars, then vars and vals 在其类型方面会有不一致的行为:

val x: Supertype = Subtype()
var y: Supertype = Subtype()

// inconsistent:
x.someSubtypeStuff() // doesn't work, x is a Supertype
y.someSubtypeStuff() // works, y is smart casted to Subtype

因此,他们最终没有实现智能强制转换来进行初始化。

由于票证仍然开放,该功能很可能会在 Kotlin 的未来版本中实现。它可能只支持vars, both vars and vals,或者只是可为 null 的类型。让我们期盼最好的结果!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Kotlin 的 null 安全性不能与局部变量初始化器一起正常工作? 的相关文章

随机推荐