java – 为什么在下载时不会在编译时抛出classcastException?
作者:互联网
考虑下面的例子. main(注释)的第5行在运行时抛出ClassCastException.
第4行是一个有效的演员,因为v1具有汽车的“知识”.同样,不应该第5行给出编译时错误,因为它有“知识v2”是车辆而不是汽车因此抛出编译时错误说“嘿,我不知道汽车,我是车辆,你不能被投入汽车”.
在编译期间,Vehicle v1 = new Car(),不会创建新的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就会忘记了什么v2不是“它的车辆或车辆的某个子类型”.
标签:java,casting,classcastexception,downcast 来源: https://codeday.me/bug/20190528/1174773.html