如果您有两个不同的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;
答案 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)
如果B
是A
的子类,则上述应该有效,并且不需要强制转换:
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年发布)开始,关于。
的演示语法应该不多