我你好!
我想克隆一个具有父类(super class)型“A”的对象“B”。 在“B”的clone()方法中,我调用super.clone()(“A”的方法)。此方法返回“A”类型,其中克隆并设置了字段。
在“B”的clone()方法中,我从super.clone()获得了“预构造”返回的对象,我想继续克隆它。所以我必须将其转换为“B”类型对象。
编译时没有问题,但在运行时会崩溃 ClassCastException。
是否可以将一个对象转换为其子类型? 或者我必须克隆“B”clone() 方法中的所有字段(甚至“A”类字段)?
谢谢。
最佳答案
正确的克隆需要使用虚拟方法,该方法在支持克隆的最低级别中实现,并且(取决于克隆的实现方式)要么被超出添加需要的新字段的每个级别覆盖深度克隆,或者被每个派生类覆盖。
如果 clone
的所有实现通过调用 super.clone
进行工作,直到最低级别的类调用 object.clone
为止,然后调用clone
在已转换为基类型的派生类型上将生成该派生类型的对象。不幸的是,相信super.clone
被破坏导致许多人使用复制构造函数而不是调用 super.clone
,从而创造了一个不幸的 self 实现的预言。
考虑到这种不幸的情况,最好的办法可能是让每个类的父类都公开 clone
可能不会链接到 object.clone
的方法,暴露 protected
复制构造函数,它采用其类型的实例,链接到父类的复制构造函数,复制由该派生类型添加的任何公开公开(或映射到属性)或引用不可变对象(immutable对象)的字段,并克隆该派生类型的任何字段派生类型不公开公开并引用可变对象。这种方法可行,但从可克隆类派生的每个类都需要实现自己的虚拟克隆方法重写,即使该方法所做的唯一事情就是调用其自己类的 protected 复制构造函数。
如果您的父类具有非虚拟克隆方法,该方法在没有虚拟分派(dispatch)的情况下调用某种构造函数,则无法正确实现任何派生类。
关于java - 当我想将 Type 转换到其 Sub 中进行克隆时,运行时出现 ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9100802/