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.data
或 null
。因此它不是 null-safe 来获得它的 length
,而是你应该再次使用 safe call operator:test?.data?.length
.
可空性通过整个调用链传播:您必须将这些链写为 a?.b?.c?.d?.e
(这又等同于 (((a?.b)?.c)?.d)?.e
),因为,如果左侧部分之一为空,则无法执行其余调用,就好像该值为 not-null.
如果您不想在调用链的每个 non-nullable 组件之前使用安全调用,您可以使用标准扩展函数将第一个安全调用的结果获取到新变量中 run
或 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?
。
我是 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
。因此它不是 null-safe 来获得它的 length
,而是你应该再次使用 safe call operator:test?.data?.length
.
可空性通过整个调用链传播:您必须将这些链写为 a?.b?.c?.d?.e
(这又等同于 (((a?.b)?.c)?.d)?.e
),因为,如果左侧部分之一为空,则无法执行其余调用,就好像该值为 not-null.
如果您不想在调用链的每个 non-nullable 组件之前使用安全调用,您可以使用标准扩展函数将第一个安全调用的结果获取到新变量中 run
或 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?
。