为什么var foo = null编译

时间:2017-05-31 18:58:17

标签: kotlin

我从Kotlin开始并试图了解一些事情。

var foo: String = null无法按预期编译。

var foo: String? = null应该是正确的语法并按预期编译。

那么为什么var foo = null编译?

3 个答案:

答案 0 :(得分:9)

在这种情况下,foo的类型将推断为Nothing?,这是一种非常特殊的类型。简而言之,Nothing是Kotlin中每种类型的子类型(因此Nothing?是每个可空类型的子类型),没有实例,并且可以用作函数的返回类型永远不会回来。

即使Nothing没有实例,null本身也是类型Nothing?,这就是为什么它可以分配给任何可以为空的变量。

您可以在official docsthis excellent Medium article以及涵盖整体Kotlin类型层次结构的this article中详细了解Nothing。{/ p>

答案 1 :(得分:5)

对于var foo = null,类型推断为Nothing?,因此是有效的语法。

答案 2 :(得分:4)

var foo = null相当于var foo:Nothing? = null

类似地

var foo = ""相当于var foo:String = ""

和slo

var foo = 1相当于var foo:Int = 1

编译器足够聪明,可以从右手表达式类型推断出foo的类型。