【问题标题】:Kotlin data classes and nullable typesKotlin 数据类和可为空的类型
【发布时间】:2017-02-03 13:17:52
【问题描述】:

我是 Kotlin 的新手,我不知道为什么编译器会抱怨这段代码:

data class Test(var data : String = "data")

fun test(){
  var test: Test? = Test("")
  var size = test?.data.length
}

编译器向test?.data.length 抱怨,它说我应该这样做:test?.data?.length。但是数据变量是String,而不是String?,所以我不明白为什么我要检查长度时必须放?

【问题讨论】:

    标签: android kotlin data-class


    【解决方案1】:

    表达式test?.data.length 等价于(test?.data).length,而test?.data 部分可以为空:它可以是test.datanull。因此,获取它的length 不是空安全的,而是您应该再次使用safe call operatortest?.data?.length

    可空性通过整个调用链传播:您必须将这些链写为a?.b?.c?.d?.e(同样,等同于(((a?.b)?.c)?.d)?.e),因为如果左侧部分之一为空,则其余部分不能像值不为空一样执行调用。

    【讨论】:

    • 好的,我现在明白了。非常感谢!
    【解决方案2】:

    如果您不想在调用链的每个不可为空的组件之前使用安全调用,您可以使用标准扩展函数runlet 将第一次安全调用的结果放入一个新变量中:

    // `this` is non-nullable `Test` inside lambda 
    val size = test?.run { data.length }   
    
    // or: `it` is non-nullable `Test` inside lambda
    val size = test?.let { it.data.length }
    

    请注意,size 在此处仍然可以为空 Int?

    【讨论】:

    • 非常感谢!
    猜你喜欢
    • 2017-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2017-07-06
    • 2019-08-12
    相关资源
    最近更新 更多