因此给定:
val c: Circle? = Circle(5)
println(c.circumference())
Kotlin编译器抱怨无法调用circumference()
,因为c
可能为null。这是真的吗?还是编译器是个卑鄙的骗子?
编译器是个卑鄙的骗子。c
不可能是null
。由于c
是val
,因此它没有(合法的(方法来更改其值,例如在另一个线程中,并且可以证明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值。