Java 从obj2强制转换或创建obj1,其中obj1和obj2扩展同一抽象类

Java 从obj2强制转换或创建obj1,其中obj1和obj2扩展同一抽象类,java,Java,例如,我有: public abstract class SomeAbstract { private int a; private int b; .. private int z; } public class A extends SomeAbstract { private String aField; } public class B extends SomeAbstract { private long bField; } (省略默认构造函数/设置器/获取器

例如,我有:

public abstract class SomeAbstract {
  private int a;
  private int b;
  ..
  private int z;
}

public class A extends SomeAbstract {
  private String aField;
}

public class B extends SomeAbstract {
  private long bField;
}
(省略默认构造函数/设置器/获取器)

我有一些a类的实例,我想创建 a中类B的实例(抽象字段)

是的,我可以像这样使用抽象类构造函数或为类B创建构造函数:

public B(A a) {
  this.a = a.getA();
  this.b = a.getB();
  ..
  this.z = a.getZ(); 
}
但由于我有很多领域,这看起来并不好和方便
还有其他方法吗?

您可以在接收另一个超类的超类中创建构造函数

public abstract class SomeAbstract {
    /* attributes... */

    public SomeAbstract() {
    }

    protected SomeAbstract(SomeAbstract another) {
        this.a = another.a;
        /* and on... */
    }

}
并在子类中重用此构造函数:

public class B extends SomeAbstract {

    public B(A a) {
        super(a);
        this.specificAttribute = a.somethingElse;
    }

}

如果您有那么多字段,并且不想/不需要手动创建整个代码,那么可以使用外部库来帮助您实现类之间的映射。有些选择是:

  • 在对象之间映射数据的。可以通过XML或注释进行配置。此库使用反射工作(AFAIK),因此它可能会直接影响应用程序的性能
  • 在运行时生成字节码以在对象之间映射数据。配置在设计时完成。这个库使用反射工作(AFAIK),因此它可能会直接影响应用程序的性能,当我测试它时,执行时间比Dozer快(大约快7倍)
  • 这将生成映射类的代码(使用getter和setter、验证null和on),并且该代码将在运行时可用。配置在设计时通过注释完成。这个库使用Java代码工作(AFAIK),因此它类似于代码的正常执行(例如执行
    b.setValue(a.getValue())

您所能做的最好的事情就是使用超类“复制构造函数”分解出公共元素(即抽象超类的成员)。@shubhandupramanik感谢您的注释。我添加了一些框架,可以在许多领域提供帮助。