举个例子
public class Animal
{
public void eat(){}
}
public class Dog extends Animal
{
public void eat(){}
public void main(String[] args)
{
Animal animal=new Animal();
Dog dog=(Dog) animal; //will not work
}
}
通过使用强制转换,您实际上是在告诉编译器“相信我。我是专业人士,我知道自己在做什么,而且我知道虽然您不能保证,但我告诉您这个动物变量是肯定会变成一条狗。”
由于动物实际上不是狗(它是动物,您可以执行 Animal animal = new Dog(); 并且它会是狗)VM 在运行时抛出异常,因为您违反了该信任(您告诉编译器一切都会好的,但不是!)
编译器比盲目地接受所有东西要聪明一点,如果您尝试将对象转换为不同的继承层次结构(例如将 Dog 转换为 String),那么编译器会将其扔回给您,因为它知道这永远不可能工作。
因为您实际上只是在阻止编译器抱怨,所以每次转换时,重要的是检查您不会通过在 if 语句中使用 instanceof (或类似的东西)来导致 ClassCastException。
在您的情况下,您是说我的引用 b 将指向 B 点的对象,然后将其指向 A 类的对象(这不是引用 b 所期望的 B 类的对象)。因此你得到了classCastException。
你可以做类似的事情
A a = new B();
B b = (B) a;