如果构造函数不能返回 null,为什么初始化后需要类型检查?



因此给定:

val c: Circle? = Circle(5)
println(c.circumference())

Kotlin编译器抱怨无法调用circumference(),因为c可能为null。这是真的吗?还是编译器是个卑鄙的骗子?

编译器是个卑鄙的骗子。c不可能是null。由于cval,因此它没有(合法的(方法来更改其值,例如在另一个线程中,并且可以证明c不能是null。考虑稍微简单一点的情况(不需要外部类(:

val i1: Int? = 42
val i2: Int = i1

即使这样也不会编译。但是,以下内容将:

val i1: Int? = 42
checkNotNull(i1)
val i2: Int = i1

这里,checkNotNull(来自标准库中的PreConditions(执行一些null检查,编译器将创建一个智能强制转换。我认为JetBrains可以修复编译器,但除了演示之外,几乎没有什么用处。

kotlin官方编译器抱怨对可为null类型的不安全调用

Circle?类型的可为null的接收器上只允许进行安全(?.(或非null断言(!!.(调用?

Nullable是不需要的,可以在您的中删除

val c: Circle = Circle(5)
println(c.circumference())

因为显式地将类型设置为Circle?,所以还将代码语义设置为期望null值。

相关内容

  • 没有找到相关文章

最新更新