2017-05-31 50 views
4

我从Kotlin开始尝试理解某些东西。为什么var foo = null编译

var foo: String = null没有按预期编译。

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

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

+5

为什么你期望它*不*编译?科特林只是推断一个合适的类型。 –

回答

8

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

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

您可以了解更多深约在official docsNothing,在this excellent Medium article,并在this article覆盖整个科特林类型层次。

5

对于var foo = null,类型推断Nothing?,因此是有效的语法。

+2

I.e.你只能在该变量中存储空值。 –

4

var foo = null相当于var foo:Nothing? = null

同样

var foo = ""相当于var foo:String = ""

和SLO

var foo = 1等同于var foo:Int = 1

编译器是智能enou gh从右手表达式推断foo的类型。