为什么即使在这个例子中已经确定了类型仍然需要铸造类型?

Nea*_*roo 0 optimization casting kotlin

今天我在Kotlin Docs中看到了这一部分.Kotlin被称为"聪明的演员阵容",似乎"在需要时自动插入(安全)演员阵容":

在许多情况下,不需要在Kotlin中使用显式强制转换运算符,因为编译器会跟踪对不可变值的is-checks并在需要时自动插入(安全)强制转换:

fun demo(x: Any) {
    if (x is String) {
        print(x.length) // x is automatically cast to String
    }
}
Run Code Online (Sandbox Code Playgroud)

我不明白这个例子中"智能铸造"的作用.似乎没有什么需要转换,因为它x总是String,因此x.length总是有效,不需要转换.print线路上究竟发生了什么?提前致谢!

zsm*_*b13 6

x有一个类型Any,该类型没有.length属性.但是,因为在if块内部,它已知x实际上是a String,它会获得类型的智能转换,并且您可以调用方法并访问String该类的属性.

这段代码的Java版本看起来像这样,String即使在进行类型检查之后你也需要一个显式的强制转换:

void demo(Object x) {
    if(x instanceof String) {
        System.out.print(((String) x).length());
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是Kotlin为您简化的内容.