为什么 Java 不允许您执行类似注释掉的行的操作?
public static void example(Object other) {
if (!(other instanceOf Person)) {
return;
} else {
Person p = (Person) other;
System.out.println(p.name);
// System.out.println(other.name);
}
}
我知道 Java 是静态类型的,因此必须在编译时知道类型,这就是为什么必须将 Object
显式转换为 Person
的原因。但是,是否存在执行类似于注释掉的行的操作会使程序崩溃或危险的情况?按照逻辑,为了进入else
子句,类型必须是Person,为什么Java不知道呢?
什么是不安全的类似情况的示例?
最佳答案
没有合乎逻辑的理由说明它不能。语言不是这样设计的。这不是您可以在不破坏向后兼容性的情况下添加的功能,并且 Java 始终将向后兼容性放在首位 - 这是它如此成功的原因之一。
Kotlin 允许您这样做(他们称之为 smart cast )并且 Kotlin 编译为与 Java 相同的字节码。所以从技术上讲,Java 做不到的原因并不存在,它就是做不到。
也就是说,我们最终可能会获得这样的功能。这是just a candidate at the moment .建议的语法类似于:
if (x matches Integer i) {
// can use i here
}
所以看起来 x
会保持不变,一个新的变量 i
会被声明为给定的类型。
关于java - 为什么 Java 在检查之后不假定类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52768899/