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.data
或null
。 因此,获取它的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?
这里。