Смарт-кастинг не работает при рефакторинге выписки. Как решить? - PullRequest
0 голосов
/ 16 мая 2018

У меня есть кое-что простое ниже (я использую когда вместо вместо, как я упростил из некоторого кода, который использует когда)

fun simplePresent(presentable: Presentable?) {
    when {
        presentable != null -> execute(presentable)
        else -> skip()
    }
}

fun execute(presentable: Presentable) { // Do something }

Все хорошо. Но когда я реорганизую проверочный код в функцию

fun simplePresent(presentable: Presentable?) {
    when {
        hasPresentable(presentable) -> execute(presentable)
        else -> skip()
    }
}

fun execute(presentable: Presentable) { // Do something }
fun hasPresentable(presentable: Presentable?) = presentable != null

сбой умного приведения к ненулевому значению при передаче значения в функцию execute, что приводит к сообщению об ошибке времени компиляции required Presentable found Presentable?

Как я могу предотвратить эту ошибку, пока я все еще сохраняю свой код рефакторинга?

1 Ответ

0 голосов
/ 16 мая 2018

Функции должны быть независимыми друг от друга.Нет никаких ограничений на принудительное возвращение hasPresentable истинного значения, если презентабельность не равна нулю на уровне типа.

Так что это невозможно без команды Kotlin, решившей усовершенствовать систему типов.

Почемуне использовать что-то вроде presentable?.execute() ?: skip() вместо?

Если вы хотите выполнить дополнительную проверку в hasPresentable, вы можете сделать это:

fun checkPresentable(presentable: Presentable?): Presentable? =
  presentable?.takeIf { do your check here }

fun simplePresent(presentable: Presentable?) =
  checkPresentable(presentable)?.execute() ?: skip()

fun Presentable.execute() {  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...