Умный актерский состав Котлина не справляется с простым выводом - PullRequest
0 голосов
/ 08 февраля 2019

Попытка понять, почему умное приведение Kotlin не срабатывает для довольно простого варианта использования:

val x: Int? = 1

val notNull: Boolean = x != null

if (notNull) {
    val y: Int = x // fails to smart cast
}

Однако это работает, если мы удалим промежуточное val:

val x: Int? = 1

if (x != null) {
    val y: Int = x // smart cast works
}

val по существу определяет значение final, поэтому я не вижу причины, по которой первая версия не будет работать.

Для записи, аналогичной Java-аналогу (https://github.com/uber/NullAway) также не срабатывает для таких случаев использования, поэтому может быть какое-то основное осложнение, делающее такие вычеты невозможными?

1 Ответ

0 голосов
/ 09 февраля 2019

Вы должны видеть это так.notNull назначается с true (результат x != null).После этой строки нет информации, доступной для компилятора, чтобы установить связь между этим значением и значением n.

По сути, это то же самое, что написать это прямо сейчас:* Вы можете сказать то же самое для

if (x != null) {
    val y: Int = x // smart cast works
}

, скажете вы.Верно, но в этом случае компилятор сразу предлагает x в блоке if как ненулевое значение.Вот где он проводит черту.Если вы не остановитесь где-нибудь, у вас будет много выводов, что сделает процесс компиляции менее эффективным.

...