2012-02-01 60 views
0

IHello!ClassCast在运行时异常时,我想将一个类型转换为它的子类进行克隆

我想克隆具有超类型“A”的对象“B”。 在“B”的clone()方法中,我调用super.clone()(“A”的方法)。此方法返回一个“A”类型的克隆和设置字段。

在“B”的clone()方法,我从super.clone()来“预构建”返回的对象,我想继续克隆。所以我必须将它投入到“B”型对象中。

在编译的时候没有问题,但它在运行时崩溃一个ClassCastException。

是否可以将对象转换为其子类型? 还是必须克隆“B”clone()方法中的所有字段(即使是“A”类字段)?

谢谢。

+0

也许有点offtopic这里,但我使用Apache的百科全书假设是匹配的制定者BeanUtils.copyProperties()/吸气剂是可用的。不知道它如何实施,所以可能会产生副作用。我意识到这并不能回答这个问题,但在过去遇到类似问题时帮助了我 – jambriz 2012-02-01 18:50:49

回答

1

正确的克隆需要使用虚拟方法,它是在支持克隆,最低级别实现的 - 这取决于克隆是如何实现的 - 要么通过超越每一个水平,这增加了新的字段将覆盖需要深度克隆,或者被每个派生类,期间所覆盖。

如果通过调用super.clone,至多其中最低级别的类调用object.clone的位置,然后在其上已经转换为基类型的派生类型的主叫clone工作的clone所有实现将产生派生类型的对象。不幸的是,super.clone被破坏的信念导致许多人使用复制构造函数而不是调用super.clone,从而创建了一个不幸的自我实现的预言。

由于不幸的情况,最好的可以做很可能是让每个类的父暴露了一个clone方法,可能无法链object.clone,暴露出protected拷贝构造函数获取其类型的实例,链父类的拷贝构造函数,复制由派生类型添加的公开显示的任何字段(或映射到属性)或引用不可变对象,并克隆该派生类型中未公开公开的任何字段并引用可变对象。这种方法是可行的,但是从可克隆类派生的每个类都必须实现自己对虚拟克隆方法的重写,即使该方法唯一的作用是调用其自己的类的受保护的副本构造函数。

如果你的父类有要求某种构造的无虚派遣一个非虚克隆方法,那么就不可能正确地实现任何派生类。

0

感谢您的回答,但我找到了解决方案: 我不知道在我的超类的clone()方法中,我不得不通过调用super.clone()(native克隆()从对象类?)并将其转换为我的类型。 (我做了显式实例MySuperType t = new MySuperType())。现在,我得到一个MySuperType,我可以在我的子类中向下转换: (MySubClass)sc =(MySubClass)super.clone();

谢谢你,所以我会在我的博客写www.patate-chaude.fr一个帖子!

相关问题