让我们说:
class A {
public int fieldA = 0;
}
class B extends A {
public int fieldB = 0;
}
Run Code Online (Sandbox Code Playgroud)
现在,我想从A创建一个B实例:
A a = new A();
B b = (B) new A();
Run Code Online (Sandbox Code Playgroud)
这给出了classCastException.我可以在B中创建一个带有A实例和复制字段的costructor,但它显然是非实际的:
class B extends A {
public int fieldB = 0;
B (A a){
fieldA = a.fieldA;
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢您的帮助
以下面的例子为例
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
}
}
Run Code Online (Sandbox Code Playgroud)
通过使用演员你基本上告诉编译器"相信我.我是一个专业人士,我知道我在做什么,我知道虽然你不能保证,但我告诉你这个动物变量是肯定会成为一只狗."
由于动物实际上不是狗(它是动物,你可以做动物动物=新狗();而且它是狗)VM在运行时抛出异常,因为你违反了那种信任(你告诉过)编译器一切都会好的,但事实并非如此!)
如果你尝试在不同的继承层次结构中强制转换对象(例如将一个Dog转换为一个String),那么编译器会比盲目地接受所有内容更聪明一点,然后编译器会将它抛回给你,因为它知道它永远不会起作用.
因为你实际上只是停止编译器的抱怨,所以每次你强制转换它都很重要,通过在if语句中使用instanceof来检查你是否会导致ClassCastException(或者是那种效果.)
在你的情况下,你说我的参考b将指向B点的对象,然后你指向A类的对象(这不是B类的参考b期望的对象).因此,您将获得classCastException.
你可以做点什么
A a = new B();
B b = (B) a;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
404 次 |
| 最近记录: |