2017-05-31 57 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的類型。

相關問題