自定义对象投射方法

时间:2012-03-19 18:36:01

标签: java oop casting

如果您有两个不同的A和B类,而B是A的子类,则不能按如下方式进行转换:

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

有没有办法在没有JVM抛出ClassCastException的情况下启用上面的代码(不改变上面的代码)?

------------ ---------- EDIT

抱歉,我在上述问题的代码中犯了一个错误。正确的版本如下:

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

4 个答案:

答案 0 :(得分:4)

B已经与A建立了 is-a 关系。你不需要强制转换....你可以在任何期望/指向A的方法或引用中抛出一个B.

根据您的编辑 - 如果您想要这样做,您的设计会出现问题。虽然B 是-a A,但相反的是 NOT 为true。 A不是B。换句话说,由于B扩展A,因此它可能在其上具有未在A上定义的方法/属性。如果将A强制转换为B,那么接受该引用的方法可能会尝试调用它认为在实例上的方法,因为您告诉编译器它有一个B ,实际上,基础A没有所需的方法。

在这里施展只会导致痛苦和失败。

答案 1 :(得分:2)

我认为你可以简单地指定:

A newA = b;

答案 2 :(得分:2)

如果BA的子类,则上述应该有效,并且不需要强制转换:

A a = new A();
B b = new B();
A newA = b; // no need to cast!

答案 3 :(得分:1)

使用新代码,不,你不能这样做。您必须创建一个新对象:

B newB = new B(a);

B newB = B.of(a);

无论如何,通常应避免使用非抽象的非叶类。此外,从1.5(2004年发布)开始,关于。

的演示语法应该不多