尽管在这个例子中已经确定了,为什么仍然需要强制类型?

今天我在Kotlin Docs中遇到了这个部分。 被称为“聪明的演员”,Kotlin似乎“在需要时自动插入(安全)演员”:

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

fun demo(x: Any) { if (x is String) { print(x.length) // x is automatically cast to String } } 

我不明白在这个例子中“智能铸造”是做什么的。 似乎没有什么需要铸造,因为x将始终是字符串,因此x.length将始终工作,不需要铸造。 print线上发生了什么? 提前致谢!

x有一个Any类型,该类型没有.length属性。 但是,由于在if块内部,已知x实际上是一个String ,所以它能够聪明地转换该类型,并且可以调用String类的方法和访问属性。

这个代码的Java版本看起来像这样,即使在执行类型检查之后,您仍需要对String进行明确的转换:

 void demo(Object x) { if(x instanceof String) { System.out.print(((String) x).length()); } } 

这就是Kotlin为你简化的。

如果没有智能转换,你将不得不告诉编译器类型实际上是一个字符串,因为任何length都不存在。

 println((x as String).length) 

随着智能铸造这不再是必要的。