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

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/

10-11 05:18
查看更多