我有一个具有40个属性的抽象超类.我还有2个子类,它们基本上扩展了超类.现在我想把一个子类转换成另一个子类.

public abstract class ParentClass{
  // ... many attributes 
}

public ChildClassA extends ParentClass{}
public ChildClassB extends ParentClass{}

像这样的简单类转换不起作用,并引发ClassCastException:

public ChildClassA to(){
    return (ChildClassA) ((ParentClass) this);
}

我可以手动编写一个复制构造函数,但这是一项繁琐的工作.

另一种方法是序列化和转换.例如,使用XML或JSON.但这用于克隆类,再次反序列化将引发类强制转换异常.

还有其他更好的方法吗?

EDIT:

由于人们要求设计决策:

我有两个相同列的表.一个表有数据,另一个没有.我必须从原始表中检索行->执行处理->放回第二张桌子.

因此,为了最小化代码复杂性,我使用了超类实体(JPA),它包含所有字段(超过40个字段,用‘’注释),并从中扩展了2个子类(因 for each 类只能有1个@Table注释).

现在要进行处理,我需要将数据从原始表检索到原始子类.创建新的第二个子类,并将值从原始复制到新.进行处理.将第二个实体持久化到第二个表中.

推荐答案

我会质疑用不添加任何内容的子类扩展基类的设计决策,尤其是因为它们必须从一个转换到另一个.您可以使用一个类,但添加一个枚举字段来区分不同类型.然后,转换将只是将此字段更改为不同的值.

然而,如果您真的需要它们是不同的类,并且能够从一个类转换到另一个类,并且您不想编写繁琐的代码来手动复制字段,那么您可以查找一些Java映射框架,例如MapStruct.

Java相关问答推荐

在未跨多次运行重写过go 的数据的情况下将数据写入到SON文件时遇到问题(使用Jackson)

Java 8 RDX-如何设置单个选项卡标题文本的 colored颜色

S的字符串表示是双重精确的吗?

基本时态运算的ISO-8601周数据表示法

无法处理批处理侦听器中的反序列化异常

Java中如何根据Font.canDisplay方法对字符串进行分段

通过合并Akka Streams中的多个慢源保持订购

为什么一个Test的instance?& gt;在构造函数中接受非空对象?

在bash中将数组作为Java程序的参数传递

如何使用SpringBoot中的可分页对整数作为字符串存储在数据库中时进行排序

搜索列表返回多个频道

将PNG转换为位图自定义十六进制字符串

Lombok@Nonnull是否也对供应商有影响?

如何在太阳系模拟器中添加月球?

是否在settings.xml中使用条件Maven镜像?

Java堆中的许多java.time.ZoneRegion实例.ZoneId实例不应该被缓存吗?

将双倍转换为百分比

嘲笑黄瓜中的对象

在Eclipse中可以使用外部字体吗?

Java泛型方法重载