【问题标题】:What is wrong in this kotlin null safety in when?什么时候这个 kotlin 空安全性有什么问题?
【发布时间】:2019-05-07 00:16:14
【问题描述】:

我是一名 kotlin 学习者 day1。我从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"))
}

【问题讨论】:

  • 你应该在变量类型后面加上问号以表示它可以为空:fun describe(obj: Any?): .... 并在when 中删除?
  • 只是一些基本的语法错误。您看到的错误是否为您提供了一些可能出错的提示?

标签: kotlin


【解决方案1】:

表示可以为空的东西的问号出现在类型上,而不是变量名上。您还使用了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 不是字符串,因此对于 null 值,您会得到“非字符串”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多