考虑以下示例。 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
}
}
答案 0 :(得分:3)
Java不会传播这样的信息。只要您说Vehicle v2 = new Vehicle()
,Java就会忘记v2
除了Vehicle
或Vehicle
的某个子类型之外的所有知识。
答案 1 :(得分:3)
不,编译器不知道v1
或v2
引用的实际对象是什么。它只知道引用类型。实际对象在运行时进入画面。因此,编译器不会,它不应该为您提供编译器错误。