Android Kotlin数据类和可空类型

Android Kotlin数据类和可空类型,android,kotlin,data-class,Android,Kotlin,Data Class,我是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?,所以我不明白当我想检查长度时为什么我必须把?放进去。

我是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.data
要么是
null
。因此,获取其
长度
不是空安全的,而是应该再次使用:
test?.data?.length


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

如果不想在调用链的每个不可为null的组件之前使用safe call,则可以使用标准扩展函数
run
let
,将第一次safe调用的结果放入新变量中:

// `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?

非常感谢!好的,我现在明白了。非常感谢!