我从Kotlin开始并试图了解一些事情。
var foo: String = null
无法按预期编译。
var foo: String? = null
应该是正确的语法并按预期编译。
那么为什么var foo = null
编译?
答案 0 :(得分:9)
在这种情况下,foo
的类型将推断为Nothing?
,这是一种非常特殊的类型。简而言之,Nothing
是Kotlin中每种类型的子类型(因此Nothing?
是每个可空类型的子类型),没有实例,并且可以用作函数的返回类型永远不会回来。
即使Nothing
没有实例,null
本身也是类型Nothing?
,这就是为什么它可以分配给任何可以为空的变量。
您可以在official docs,this 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
的类型。