Kotlin 数据 类 和可空类型

Kotlin data classes and nullable types

我是 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?,所以我不明白为什么我要检查长度时必须放?

表达式 test?.data.length 等同于 (test?.data).length,并且 test?.data 部分可以为空:它是 test.datanull。因此它不是 null-safe 来获得它的 length,而是你应该再次使用 safe call operatortest?.data?.length.

可空性通过整个调用链传播:您必须将这些链写为 a?.b?.c?.d?.e(这又等同于 (((a?.b)?.c)?.d)?.e),因为,如果左侧部分之一为空,则无法执行其余调用,就好像该值为 not-null.

如果您不想在调用链的每个 non-nullable 组件之前使用安全调用,您可以使用标准扩展函数将第一个安全调用的结果获取到新变量中 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?