请看这段代码:
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
虽然如此,但如果智能转换仅实现var
s, then vars
and val
s 在其类型方面会有不一致的行为:
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 的未来版本中实现。它可能只支持var
s, both var
s and val
s,或者只是可为 null 的类型。让我们期盼最好的结果!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)