public class Animal {
    public void eat() {}
}

public class Dog extends Animal {
    public void eat() {}

    public void main(String[] args) {
        Animal animal = new Animal();
        Dog dog = (Dog) animal;
    }
}

赋值Dog dog = (Dog) animal;不会生成编译错误,但在运行时会生成ClassCastException.为什么编译器不能检测到这个错误?

推荐答案

通过使用cast,你基本上是在告诉编译器"相信我,我是专业人士,我知道我在做什么,我知道虽然你不能保证,但我告诉你,这个animal变量肯定会是一只狗."

由于该动物实际上不是狗(它是一只动物,你可以做Animal animal = new Dog();,它应该是一只狗),虚拟机在运行时抛出一个异常,因为你违反了这种信任(你告诉编译器一切都会好的,但事实并非如此!)

编译器比盲目地接受一切要聪明一些,如果你try 在不同的继承层次 struct 中转换对象(例如,将狗转换为字符串),那么编译器会把它扔给你,因为它知道这永远不可能工作.

因为你基本上只是在阻止编译器抱怨,所以每次你强制转换的时候,重要的是要判断你不会因为在if语句中使用instanceof(或类似的东西)而导致ClassCastException

Java相关问答推荐

在数组中使用意想不到的结果

如果您仅同步写操作,Java布尔线程是否安全

在Keycloak测试容器中的测试之间清理数据库

将@ManyToOne JPA Composite Key用作Id保存实体添加额外参数

try 使用Java 9或更高版本对特殊对象图进行解析时出现NullPointerException

JsonPath在多个线程中返回错误的值

我想了解Java中的模块化.编译我的应用程序时,我有一个ResolutionException

方法没有用正确的值填充数组—而是将数组保留为null,'

在for—each循环中的AnimationTimer中的if语句'

JUnit—如何模拟局部变量对象方法调用

使用意向过滤器从另一个应用程序启动服务

更新GWT 2.5.1到2.11.0和sencha GXT 3.1.1到4.1时出现错误

如何获取Instant#of EpochSecond(?)的最大值

与不同顺序的组进行匹配,不重复组但分开

Arrays.hashcode(int[])为不同的元素提供相同的散列

Java17支持哪个MapR版本?

Domino中不同的java.Protocol.handler.pkgs设置在XPages Java中导致错误

有没有办法知道在合并中执行了什么操作?

如何在Struts2中使用操作类中的结果注释重定向到不同的命名空间

[Guice/MissingImplementation]:未绑定任何实现