Java 自定义对象转换方法
如果有两个不同的类A和B,并且B是A的子类,则不能按如下方式强制转换:Java 自定义对象转换方法,java,oop,casting,Java,Oop,Casting,如果有两个不同的类A和B,并且B是A的子类,则不能按如下方式强制转换: A a = new A(); B b = new B(); A newA = (A)b; 有没有一种方法可以在JVM不抛出ClassCastException的情况下使上述代码正常工作(不修改上述代码) ------------编辑---------- 对不起,我在上面的问题中犯了一个错误。正确的版本如下: A a = new A(); B b = new B(); B newB = (B)a; 我认为您可以简单地分配:
A a = new A();
B b = new B();
A newA = (A)b;
有没有一种方法可以在JVM不抛出ClassCastException的情况下使上述代码正常工作(不修改上述代码)
------------编辑----------
对不起,我在上面的问题中犯了一个错误。正确的版本如下:
A a = new A();
B b = new B();
B newB = (B)a;
我认为您可以简单地分配:
A newA = b;
B
已经与a
存在is-a关系。您不需要强制转换它……您可以对任何期望/指向a
的方法或引用强制转换B
根据您的编辑--如果您想这样做,您的设计有问题。虽然aB
是-aa
,相反的是不是。A
不是B
。换句话说,由于B
扩展了A
,因此它可能具有A
上未定义的方法/属性。如果将A
强制转换为B
,那么接受该引用的方法可能会尝试调用它认为在实例上的方法,因为您告诉编译器它得到了B
,而实际上底层A
没有所需的方法
在这里铸造只会带来痛苦和失败 如果
B
是a
的一个子类,则上述操作应有效,且不需要强制转换:
A a = new A();
B b = new B();
A newA = b; // no need to cast!
有了新代码,不,你不能这么做。您必须创建一个新对象:
B newB = new B(a);
或
无论如何,通常都应该避免使用非抽象的非叶类。另外,自1.5(2004年发布)以来,不应该有太多关于的强制转换语法。
类B扩展了{}
,对吗?即使没有强制转换,也应该可以工作。在调用类型为A
的对象的任何情况下,类型为B
的对象都是可行的替代对象,不需要强制转换。@OliCharlesworth在dscer工作的上下文中可能会有意义。。。这只是一个简单的例子是的,你可以这样“施展”。这是一个毫无意义的演员阵容,因为b已经是a型了,但这是允许的。@AlejoBrz:我误读了这个问题,但显然OP也误写了这个问题,所以我们回到了开始的地方!
B newB = B.of(a);