为什么classcastException在下载时不会在编译时抛出?

时间:2014-02-27 18:54:08

标签: java casting classcastexception downcast

考虑以下示例。 main的第5行(已评论)在ClassCastException处抛出Runtime。 第4行是有效的cast,因为v1具有汽车的“知识”。同样,第5行不应该给出compile time错误,因为它有“知识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

    }
}

2 个答案:

答案 0 :(得分:3)

Java不会传播这样的信息。只要您说Vehicle v2 = new Vehicle(),Java就会忘记v2除了VehicleVehicle的某个子类型之外的所有知识。

答案 1 :(得分:3)

不,编译器不知道v1v2引用的实际对象是什么。它只知道引用类型。实际对象在运行时进入画面。因此,编译器不会,它不应该为您提供编译器错误。