java - 为什么 Java 在检查之后不假定类型?

标签 java types casting

为什么 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/

相关文章:

python - 如何获取所有 Python 类型的列表(以编程方式)?

Java从对象到子类的转换

将整数转换为字符数组,即 123 => '123'

java - Java访问数据库的不同方式

java - 有没有办法更改 Android Google Map API 的 map 数据?

java - 适配器不会更新

java - 尝试用 Java 制作初学者货币转换器并遇到问题

oracle - Rails 5 - created_at 和 updated_at 类

c++ - 在 C++ 中转换为 void* 和 typedef

PHP: cast to (array) 和 return-type: array 不一样?