Java 为什么降档时不在编译时抛出classcastException?
考虑下面的例子。Java 为什么降档时不在编译时抛出classcastException?,java,casting,classcastexception,downcast,Java,Casting,Classcastexception,Downcast,考虑下面的例子。main(注释)的第5行在运行时抛出ClassCastException。 第4行是一个有效的cast,因为v1拥有汽车的“知识”。同样,第5行不应该给出编译时错误,因为它“知道v2”是一辆汽车而不是汽车,因此抛出编译时错误,说“嘿,我不知道汽车,我是一辆汽车,你不能被扔到汽车上” 在编译期间,Vehicle v1=new Car(),不会创建一辆new Car。但是v1知道它是一辆正确的汽车吗 class Vehicle { } class Bus extends Vehic
main
(注释)的第5行在运行时抛出ClassCastException
。
第4行是一个有效的cast
,因为v1拥有汽车的“知识”。同样,第5行不应该给出编译时错误,因为它“知道v2”是一辆汽车而不是汽车,因此抛出编译时错误,说“嘿,我不知道汽车,我是一辆汽车,你不能被扔到汽车上”
在编译期间,Vehicle v1=new Car()
,不会创建一辆new Car
。但是v1知道它是一辆正确的汽车吗
class Vehicle {
}
class Bus extends Vehicle {
}
class Car extends Vehicle {
}
public class UpcastDownCast {
public static void main(String[] args) {
Vehicle v1 = new Car(); // line 1
Vehicle v2 = new Vehicle();// line 2
// compile time error. Type mis-match
Car c0 = v1; // line 3
// v1 has knowledge of Car due to line 1
Car c1 = (Car) v1;//line 4
// Runtime Exception. v2 has no knowledge of car
Car c2 = (Car) v2;//line 5
}
}
Java不会传播这样的信息。只要你说Vehicle v2=new Vehicle()
,Java就会忘记除了“它是Vehicle
或Vehicle的某个子类型以外的任何v2
知识,编译器不知道v1
或v2
引用的实际对象是什么。它只知道引用类型。实际对象在运行时进入图片。因此,编译器不会,也不应该因此给你编译器错误 另外,这也是IDE的优势所在——静态代码分析,您(OP)肯定会得到可能错误的代码标记。@Smutje也许。但这将取决于您使用的特定代码分析工具。此外,规则应该是可配置的。到目前为止,我想到/使用了IntelliJ和Eclipse Checkstyle代码>这是有效的,因为汽车是汽车的子类型?不,这是无效的,因为没有强制转换来强制检查v1
实际上是一辆汽车。