以使用安全调用运算符(?。)的以下示例为例:
class Sample {
class A(
val sampleB: B? = B()
)
class B(
val sampleC: C = C()
)
class C(
val sampleInt: Int = 1
)
fun test() {
val intInC: Int? = A().sampleB?.sampleC?.sampleInt
}
}
我了解我们需要sampleB上的安全调用运算符(operator)。但是,为什么我们需要sampleC 上的安全调用运算符。
如果删除该运算符,它将无法编译。
根据我对运算符的理解,如果sampleB为null,则该行返回null。如果sampleB不为null,则根据其类型可以确定sampleC不为null。但是,为什么Kotlin强制对sampleC进行安全调用操作?
最佳答案
A().sampleB?.sampleC?.sampleInt
解析为
((A().sampleB)?.sampleC)?.sampleInt
类型是
A(): A
A().sampleB: B?
(A().sampleB)?.sampleC: C?
((A().sampleB)?.sampleC)?.sampleInt: Int?
因为
sampleC
之前的类型是B?
,所以?.
是必需的。关于Kotlin-安全调用接线员的链接。不必要的运算符(operator)调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47362103/