Kotlin数据类和可空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 。 但数据variables是String ,而不是String? ,所以我不明白为什么我要把? 当我想检查长度。

expression式test?.data.length等同于(test?.data).length ,并且test?.data部分可以是空的:它可以是test.datanull 。 因此,获取它的length不是无效的,而是应该再次使用安全调用操作符 : test?.data?.length

可空性是通过整个调用链传播的:你必须把这些链写成a?.b?.c?.d?.e (这又等于(((a?.b)?.c)?.d)?.e因为如果其中一个左边部分是空的,其余的调用不能被执行,就好像该值不是空值。

如果您不希望在调用链的每个不可空组件之前使用安全调用,则可以将第一个安全调用的结果转换为标准扩展函数run的新variables,或者let

 // `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? 这里。