我从Kotlin开始尝试理解某些东西。为什么var foo = null编译
var foo: String = null
没有按预期编译。
var foo: String? = null
应该是正确的语法和编译预期。
那么为什么var foo = null
编译?
我从Kotlin开始尝试理解某些东西。为什么var foo = null编译
var foo: String = null
没有按预期编译。
var foo: String? = null
应该是正确的语法和编译预期。
那么为什么var foo = null
编译?
在这种情况下foo
的类型将被推断为Nothing?
,这是一个非常特殊的类型。简而言之,Nothing
是一种类型,它是Kotlin中每种类型的子类型(因此Nothing?
是每个可为空类型的子类型),没有实例,并且可以用作无法返回的函数的返回类型。
即使Nothing
可以没有实例,null
本身的类型Nothing?
,这就是为什么它可以分配给任何可为空的变量。
您可以了解更多深约在official docsNothing
,在this excellent Medium article,并在this article覆盖整个科特林类型层次。
对于var foo = null
,类型推断Nothing?
,因此是有效的语法。
I.e.你只能在该变量中存储空值。 –
var foo = null
相当于var foo:Nothing? = null
同样
var foo = ""
相当于var foo:String = ""
和SLO
var foo = 1
等同于var foo:Int = 1
编译器是智能enou gh从右手表达式推断foo
的类型。
为什么你期望它*不*编译?科特林只是推断一个合适的类型。 –