Kotlin - 安全呼叫运营商的链接.不必要的操作员呼

Nis*_*nth 7 kotlin kotlin-android-extensions kotlin-interop kotlin-null-safety

请使用以下使用安全呼叫运算符(?.)的示例:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道我们需要在sampleB上安全调用操作符.但是为什么我们需要sampleC上的安全调用操作符.如果我删除该运算符,它不会编译.

根据我对运算符的理解,如果sampleB为null,则该行返回null.如果sampleB不为null,我们可以确定sampleC不是null,基于它的类型.但为什么Kotlin会对sampleC强制安全调用操作符?

eph*_*ent 6

A().sampleB?.sampleC?.sampleInt
Run Code Online (Sandbox Code Playgroud)

解析为

((A().sampleB)?.sampleC)?.sampleInt
Run Code Online (Sandbox Code Playgroud)

类型是

A(): A
A().sampleB: B?
(A().sampleB)?.sampleC: C?
((A().sampleB)?.sampleC)?.sampleInt: Int?
Run Code Online (Sandbox Code Playgroud)

因为之前的类型sampleC是a B?,所以?.是必需的.