Android Kotlin数据类和可空类型
我是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?,所以我不明白当我想检查长度时为什么我必须把?放进去。
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?
。非常感谢!好的,我现在明白了。非常感谢!