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())