Оператор Котлина &&
будет иметь короткое замыкание (точно так же как Java), но только во время выполнения.То, что вы испытываете, это ошибка компиляции .Особенно важно помнить при сравнении Kotlin (или Java) с Python то, что Kotlin и Java статически типизированы и имеют фазу компиляции.Таким образом, вы получите ошибку компиляции, если типы не совпадают.
Давайте пройдемся по одному за раз ...
val b = "Kotlin"
if (b != null && b.length > 0) {
...
}
В этом случае Котлин правильно сделает вывод, что b
- это тип String
, потому что вы четко его установилиСтруне ("Котлин").Здесь следует отметить, что тип String
не может содержать ноль.Зная это, часть b != null
вашего утверждения if
не нужна.Тем не менее, после оценки этого (до истины, всегда) он будет оценивать b.length
, потому что b
является String
и, следовательно, имеет свойство length
.Этот пример должен нормально скомпилироваться (я его не тестировал).
И далее ...
val b = null
if (b != null && b.length > 0) {
...
}
Этот код не скомпилируется, давайте рассмотрим, почему...
Этот код выглядит действительно похожим, но имеет одно огромное отличие.В этом случае, поскольку вы просто установили b
на null
, Котлин сделает вывод, что b
является Nothing?
.Он не имеет информации о том, какой тип вы хотите, чтобы b
был, и вы установили для него значение NULL (и поскольку это val
, оно будет всегда быть null
).Поскольку b
равно null
, это делает b
обнуляемым.
Итак, учитывая, что когда мы компилируем b != null
, это всегда не удастся, потому что b
можетникогда не будет чем-то, что не null
.Но ждать!Мы сейчас компилируем ... и когда мы сталкиваемся с b.length
, Kotlin выдаст ошибку компиляции , потому что Nothing?
не имеет свойства length
!
По сути, установив b
в null
и не предоставив подсказку типа, Kotlin выбирает единственный путь, которым он может вывести тип - Nothing?
.