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
实际上是一辆
汽车。