为什么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
的类型。