为什么var foo = null编译

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

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

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

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

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

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

您可以在官方文档中 ,在这篇出色的中文文章以及本文中涵盖整体Kotlin类型层次结构,详细了解Nothing

对于var foo = null ,类型被推断为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

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