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

时间:2017-06-25 19:39:07

标签: 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
    }
}

我不明白"智能铸造"在这个例子中。似乎没有什么需要强制转换,因为x将永远是String,因此x.length将始终有效,不需要强制转换。 print行上发生了什么?提前谢谢!

2 个答案:

答案 0 :(得分:6)

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

此代码的Java版本如下所示,即使在进行类型检查后,您还需要显式转换为String

String

这就是Kotlin为您简化的原因。

答案 1 :(得分:2)

如果没有智能强制转换,您必须告诉编译器类型实际上是一个String,因为Any上不存在length

println((x as String).length)

通过智能铸造,这不再是必要的了。