如何在 java 中使用泛型从基础 class 和派生 class 构建相同的 class
How to Build the same class from both base and derived class using generics in java
从数据库中获取数据并映射到两个 POJO 后,我想使用泛型为这两个 POJO 创建相同的对象:
public class BaseObj {
String baseVar;
}
public class DerivedObj extends BaseObj {
String derivedVar;
}
// getter setter omitted
我希望同时使用 baseVar
和 derivedVar
值来形成同一个对象:
public class MyObject {
String myBaseVar;
String myChildVar;
}
// getter setter omitted
如何创建一个通用方法,它可以同时采用基 class 和派生 class,并创建 MyObject?到目前为止我已经尝试过:
static <T extends BaseObj> MyObject buildObj(T obj) {
MyObject myObj = new MyObject();
myObj.setMyBaseVar(obj.getBaseVar());
// ⬇⬇⬇ The method getDerivedVar() is undefined for the type T ⬇⬇⬇
myObj.setMyChildVar(obj.getDerivedVar());
// Clearly it can't infer getDerivedVar from base class
return myObj;
}
从基础 class 构建 myObject 时,childVal
应该为空,但它应该从子对象获取值。
这是简化版,MyObject是深度嵌套的。有可能这样做吗?由于我的情况是将数据库数据映射到 POJO,并且这些数据彼此相关,还是我缺少其他方式?
一个丑陋的转换方法:
public static <T extends BaseObj> MyObject buildObj(T obj) {
if (obj.getClass().equals(DerivedObj.class)) {
DerivedObj derivedObj = (DerivedObj) obj; // casting to DerivedObj class
return new MyObject(obj.getBaseVar(), derivedObj.getDerivedVar());
}
return new MyObject(obj.getBaseVar(), null);
}
从数据库中获取数据并映射到两个 POJO 后,我想使用泛型为这两个 POJO 创建相同的对象:
public class BaseObj {
String baseVar;
}
public class DerivedObj extends BaseObj {
String derivedVar;
}
// getter setter omitted
我希望同时使用 baseVar
和 derivedVar
值来形成同一个对象:
public class MyObject {
String myBaseVar;
String myChildVar;
}
// getter setter omitted
如何创建一个通用方法,它可以同时采用基 class 和派生 class,并创建 MyObject?到目前为止我已经尝试过:
static <T extends BaseObj> MyObject buildObj(T obj) {
MyObject myObj = new MyObject();
myObj.setMyBaseVar(obj.getBaseVar());
// ⬇⬇⬇ The method getDerivedVar() is undefined for the type T ⬇⬇⬇
myObj.setMyChildVar(obj.getDerivedVar());
// Clearly it can't infer getDerivedVar from base class
return myObj;
}
从基础 class 构建 myObject 时,childVal
应该为空,但它应该从子对象获取值。
这是简化版,MyObject是深度嵌套的。有可能这样做吗?由于我的情况是将数据库数据映射到 POJO,并且这些数据彼此相关,还是我缺少其他方式?
一个丑陋的转换方法:
public static <T extends BaseObj> MyObject buildObj(T obj) {
if (obj.getClass().equals(DerivedObj.class)) {
DerivedObj derivedObj = (DerivedObj) obj; // casting to DerivedObj class
return new MyObject(obj.getBaseVar(), derivedObj.getDerivedVar());
}
return new MyObject(obj.getBaseVar(), null);
}