Kotlin smart cast не работает с функциями расширений - PullRequest
0 голосов
/ 08 апреля 2020

Я пытаюсь проверить обнуляемый объект с помощью функции расширения, но интеллектуальное приведение не работает после вызова этой функции.

fun <T> T?.test(): T = this ?: throw Exception()

val x: String? = "x"
x.test()
x.length // Only safe (?.) or non-null asserted (!!) calls are allowed on a nullable receiver of type String?

Это ошибка Kotlin? Если нет, то почему нет неявного приведения?

1 Ответ

0 голосов
/ 08 апреля 2020

Как упомянул @Madhu Bhat в комментарии выше, ваша переменная 'x' все еще может иметь значение null. Вы можете использовать свою функцию просто так:

x.test().length

В противном случае вы можете проверить на нулевое значение, следуя встроенной функции, а затем выполнять любые функции непосредственно над переменной. (Обратите внимание на использование 'contract' и аннотаций '@ExperimentalContracts')

@ExperimentalContracts
fun <T> T?.notNull(): Boolean {

    contract {
        returns(true) implies (this@notNull != null)
    }

    return this != null
}

Теперь вы можете использовать эту функцию следующим образом

if(x.notNull()){
  x.length
}

Но она не кажется настолько полезной, если вы используете эта функция просто для проверки обнуляемости.

Проверьте здесь, чтобы узнать больше о Kotlin контрактах

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