java - 当我想将 Type 转换到其 Sub 中进行克隆时,运行时出现 ClassCastException

标签 java exception casting

我你好!

我想克隆一个具有父类(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/

相关文章:

java - 递归:扫描数字中数字的频率:redux

java - 如何让 Sonarcloud 在来自带有 Travis、Maven 和 github 的 fork 的拉取请求上运行

java - 如何在服务器应用程序中创建对象并能够从客户端应用程序调用它们

java - Java中的不可转换类型错误

java - 当使用排序数组时,修复并编写 private static void sort

java - DAO 模式中的异常与返回码

android - XML 呈现期间出现异常

c# - 我可以拥有强大的异常安全和事件吗?

PostgreSQL bool 值转换(0 为假)

c++ - C++ 示例的错误