以使用安全调用运算符(?。)的以下示例为例:

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/

10-10 09:36