所以给定了:
val c: Circle? = Circle(5)
println(c.circumference())
Kotlin编译器抱怨无法调用circumference()
,因为c
可能为null。真的吗?还是编译器是个肮脏的骗子?
答案 0 :(得分:1)
编译器是个肮脏的骗子。 c
不可能是null
。由于c
是val
,因此没有(合法)方式可以更改其值,例如在另一个线程中,并且可以证明c
不能为{{1} }。考虑稍微简单一点的情况(不需要外部类):
null
即使这样也不会编译。但是,将执行以下操作:
val i1: Int? = 42
val i2: Int = i1
在这里,val i1: Int? = 42
checkNotNull(i1)
val i2: Int = i1
(来自标准库中的checkNotNull
)执行一些空检查,编译器将创建一个智能强制转换。我认为JetBrains可以修复编译器,但除了演示目的外,几乎没有用。
答案 1 :(得分:0)
kotlin official compiler抱怨可空类型的不安全调用
在Circle类型的可为空的接收器上只允许安全(?。)或非空声明(!!。)的呼叫吗?
不需要空值,可以根据情况将其删除
val c: Circle = Circle(5)
println(c.circumference())
答案 2 :(得分:0)
因为您将类型明确设置为Circle?
,所以还设置了代码语义以期望空值。