尽管在这个例子中已经确定了,为什么仍然需要强制类型?
今天我在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)
随着智能铸造这不再是必要的。