Ненулевое утверждение Котлина о нуле

Поскольку у Котлина есть ненулевое утверждение, я нашел несколько забавных вещей...

val myvar: String = null!!

Это потерпит крах.

Но дело в том, что он не проверяется во время компиляции.

Приложение будет зависать во время выполнения.

Разве это не должно вызвать ошибку времени компиляции?

1 ответ

Решение

!! оценивается во время выполнения, это просто оператор.

Выражение (x!!)

  • бросает KotlinNullPointerException если x == null,
  • в противном случае возвращается x приведение к соответствующему ненулевому типу (например, он возвращает его как String при вызове переменной с типом String?).

Это, конечно, делает null!! стенография для throw KotlinNullPointerException(),


Если это поможет, вы можете думать о !! делая то же самое, что и функция, подобная этой:

fun <T> T?.toNonNullable() : T {
    if(this == null) {
        throw KotlinNullPointerException()
    }
    return this as T // this would actually get smart cast, but this 
                     // explicit cast demonstrates the point better
}

Так делаю x!! даст вам такой же результат, как x.toNonNullable(),

Другие вопросы по тегам