为什么var foo = null编译

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

var foo: String = null不按预期方式编译。

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

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

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

即使Nothing不能有任何实例, nulltypes的Nothing?本身Nothing? 这就是为什么它可以分配给任何可空的variables。

您可以在官方文档中 ,在这篇出色的中文文章以及本文中涵盖整体Kotlintypes层次结构中深入了解Nothing

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

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

同样

var foo = ""等同于var foo:String = ""

和slo

var foo = 1等同于var foo:Int = 1

编译器足够聪明,可以从右手expression式types推断出foo的types。