Почему var foo = null компилируется

Я начинаю с Котлина и пытаюсь что-то понять.

var foo: String = null не компилируется, как ожидалось.

var foo: String? = null var foo: String? = null должен быть правильным синтаксисом и компилироваться, как ожидалось.

Итак, почему var foo = null компилируется ??

Тип foo в этом случае будет выведен на Nothing? , что является особым типом. Короче говоря, Nothing – это тип, который является подтипом каждого типа в Kotlin (поэтому Nothing? Является подтипом каждого типа NULL), не имеет экземпляров и может использоваться как возвращаемый тип для функций, которые никогда не могут вернуться.

Даже если Nothing может иметь никаких экземпляров, null тип типа Nothing? , поэтому его можно присвоить любой переменной с нулевым значением.

Вы можете больше узнать о Nothing в официальных документах , в этой превосходной Средней статье , и в этой статье, которая охватывает общую иерархию типа Котлин.

Для var foo = null тип выводится на 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

Компилятор достаточно умен, чтобы вывести тип foo из типа выражения правой руки.