Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 自定义对象转换方法_Java_Oop_Casting - Fatal编程技术网

Java 自定义对象转换方法

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和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 newA = b;

B
已经与
a
存在is-a关系。您不需要强制转换它……您可以对任何期望/指向
a
的方法或引用强制转换B

根据您的编辑--如果您想这样做,您的设计有问题。虽然a
B
是-a
a
,相反的是不是。
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);