今天我在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
行上发生了什么?提前谢谢!
答案 0 :(得分:6)
x
的类型为Any
,该类型没有.length
属性。但是,因为在if
块内,已知x
实际上是String
,所以它会获得智能转换类型,并且您可以调用方法并访问{{1}的属性上课。
此代码的Java版本如下所示,即使在进行类型检查后,您还需要显式转换为String
:
String
这就是Kotlin为您简化的原因。
答案 1 :(得分:2)
如果没有智能强制转换,您必须告诉编译器类型实际上是一个String,因为Any上不存在length
。
println((x as String).length)
通过智能铸造,这不再是必要的了。