Что плохого в этой безопасности? - PullRequest
1 голос
/ 07 мая 2019

Я ученик Котлина.Я получил этот код от https://kotlinlang.org/docs/reference/basic-syntax.html, а затем изменил его, чтобы проверить нулевую безопасность (https://kotlinlang.org/docs/reference/null-safety.html)

У меня есть ошибка в каждой строке. Что не так в этой нулевой безопасности kotlin, когда и как исправитьэто?

fun describe(obj?: Any): String =
    when(obj?) {
        1           -> "one"
        "hello"     -> "greeting"
        is Long     -> "long"
        !is String  -> "not String"
        is null     -> "null"
        else        -> "unknown"
    }


fun main() {
    println(describe(1))
    println(describe("Hello"))
    println(describe(1000L))
    println(describe(2))
    println(describe(null))
    println(describe("other"))
}

1 Ответ

7 голосов
/ 07 мая 2019

Знаки вопроса, чтобы сказать, что что-то обнуляемое, идут на типы, а не на имена переменных.Вы также использовали is null, что неправильно, поскольку null - это значение, а не тип.Вот ваш код с изменениями, внесенными для его компиляции и запуска:

fun describe(obj: Any?): String =
    when(obj) {
        1           -> "one"
        "hello"     -> "greeting"
        is Long     -> "long"
        !is String  -> "not String"
        null        -> "null"
        else        -> "unknown"
    }



fun main() {
    println(describe(1))
    println(describe("Hello"))
    println(describe(1000L))
    println(describe(2))
    println(describe(null))
    println(describe("other"))
}

Результат:

one
unknown
long
not String
not String
unknown

Похоже, вы хотите переместить свой чек на null выше, чтобы ваши тесты сделалиэто так далеко для null значения.Таким образом, null не является строкой, поэтому вы получаете «не String» для значения null.

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