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

时间:2019-11-20 06:48:59

标签: kotlin null optional

所以给定了:

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

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

3 个答案:

答案 0 :(得分:1)

编译器是个肮脏的骗子。 c不可能是null。由于cval,因此没有(合法)方式可以更改其值,例如在另一个线程中,并且可以证明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?,所以还设置了代码语义以期望空值。