Java 转换导致运行时错误而不是编译错误

标签 java

以下代码片段将导致运行时:

class Vehicle {
    public void printSound() {
        System.out.print("vehicle");
    }
}

class Car extends Vehicle {
    public void printSound() {
        System.out.print("car");
    }
}

class Bike extends Vehicle {
    public void printSound() {
        System.out.print("bike");
    }
}

public class Test {
    public static void main(String[] args) {
        Vehicle v = new Car();
        Bike b = (Bike) v;

        v.printSound();
        b.printSound();
    }   
}

我的问题是:为什么会导致运行时错误而不是编译错误?编译器难道不应该知道 'v' 已经是 'Car' 并且不能转换为 'Bike' 吗?

最佳答案

从理论上讲,编译器有可能对自己说:“v 是局部变量,它被分配为 Car。在任何时候之前尝试转换为 Bike 是否会更改其值,并且 Car 无法成功转换为 Bike。因此,这是一个错误。”

但是,据我所知,没有任何 Java 编译器可以为您进行这种分析。只有在最简单的情况下才真正值得。相反,行为是编译器看到了转换,并且可以将 Vehicle 转换为 Bike,因此它允许这样做。

一般来说,这就是强制转换的意思:它告诉编译器即使这个赋值可能会失败,你也很确定它不会。作为允许代码编译的交换,您承担了运行时异常的风险。

关于Java 转换导致运行时错误而不是编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10388136/

相关文章:

java - Swing JLayeredPane 停止重新绘制所有图层

Java 堆内存不足,但实际上并非如此

java - 使用 java ireport : net. sf.jasperreports.engine.JRException 生成报告时出错:编译报告 java 源文件时出错

java - 将字符串转换为 javax,json,JsonValue

java - 使倒数计时器从 10 秒变为 1 秒

java - 在 JasperException 上重定向页面

java - Windows 上的 Ant 编码问题 - UTF-8 文件但在变音符号上吐出垃圾

java - 按层次顺序获取类

java - tomcat启动时ContextLoaderListener异常

java - FileNotFound 与 .jar 和 JSSE