以下代码片段将导致运行时:
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/