如何将base转换为派生类?

时间:2014-02-22 17:16:53

标签: java

是否有解决方法允许我将基类的对象强制转换为派生类的对象?

类似于以下内容

B extends A

A a = new A();
B b = (B)a

有没有可以实现这一目标的技巧?

3 个答案:

答案 0 :(得分:3)

不,绝对没有。您期望在B中声明但A中未声明的任何字段的值是什么?例如,您期望这样做:

Object x = new Object();
String text = (String) x;
System.out.println(text);

Object没有文字数据......那么将其作为字符串投射是什么意思?

您只能将引用转换为适合该对象的实际类型的类型。

这样做的愿望通常表明某处存在设计问题......或者可能意味着你想要的东西:

public class A {
    public A() { 
        // Whatever
    }

    public A(A a) {
        // Use the existing values in "a" to initialize this object
    }
}

public class B extends A {
    /** Creates a new B from the values in an A, with suitable defaults. */
    public B(A a) {
        super(a);
        // Now initialize any fields in B with appropriate values
    }
}

然后:

A a = new A();
B b = new B(a);

这将创建两个对象,与演员不同......但它至少是有效的。

答案 1 :(得分:1)

怎么可能呢?想一想。这就好比如说你有一个班级FourWheeler,你可以简单地把它变成Ferrari并把它变成法拉利!

答案 2 :(得分:0)

不,这是不可能的。当B扩展A时,它继承了A的行为,但同时,没有什么能阻止你定义B的新行为(那些新行为不会成为A的一部分)

例如,假设A有一个名为'methodA'的方法。现在,当B扩展A时,它继承'methodA',但它也声明了另一个名为'methodB'的方法。因此,在这种情况下,当您尝试在对象A的实例上调用'methodB'时,将获得运行时'ClassCastException'。