为什么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
不能有任何实例, null
types的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。