【问题标题】:Kotlin data classes and nullable typesKotlin 数据类和可为空的类型
【发布时间】:2017-02-03 13:17:52
【问题描述】:
我是 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?,所以我不明白为什么我要检查长度时必须放?。
【问题讨论】:
标签:
android
kotlin
data-class
【解决方案1】:
表达式test?.data.length 等价于(test?.data).length,而test?.data 部分可以为空:它可以是test.data 或null。因此,获取它的length 不是空安全的,而是您应该再次使用safe call operator:test?.data?.length。
可空性通过整个调用链传播:您必须将这些链写为a?.b?.c?.d?.e(同样,等同于(((a?.b)?.c)?.d)?.e),因为如果左侧部分之一为空,则其余部分不能像值不为空一样执行调用。
【解决方案2】:
如果您不想在调用链的每个不可为空的组件之前使用安全调用,您可以使用标准扩展函数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?。