【发布时间】:2014-07-07 17:29:14
【问题描述】:
我有一个基类说
class A {
private String name;
private String age;
//setters and getters for same
}
还有一个孩子说
class B extends A {
private String phone;
private String address;
//setters and getters for same
}
现在我有一个 A 的实例,除此之外我还必须在 B 中设置字段,所以代码会是这样的,
A instanceOfA = gotAFromSomewhere();
B instanceOfB = constructBFrom(instanceOfA);
instanceOfB.setPhone(getPhoneFromSomewhere());
instanceOfB.setAddress(getAddressFromSomewhere());
我可以用给定的 A 实例化 B,但是 我不想这样做,
B constructBFrom(A instanceOfA) {
final B instanceOfB = new B();
instanceOfB.setName(instanceOfA.getName());
instanceOfB.setPhone(instanceOfA.getAge());
return B;
}
我更希望有一些实用的功能,该功能足够通用,可以构造对象,
public class SomeUtility {
public static <T1, T2> T2 constructFrom(T1 instanceOfT1, Class<T2> className) {
T2 instatnceOfT2 = null;
try {
instatnceOfT2 = className.newInstance();
/*
* Identifies the fields in instanceOfT1 which has same name in T2
* and sets only these fields and leaves the other fields as it is.
*/
} catch (InstantiationException | IllegalAccessException e) {
// handle exception
}
return instatnceOfT2;
}
}
这样我就可以使用它,
B constructBFrom(A instanceOfA) {
return SomeUtility.constructFrom(instanceOfA, B.class);
}
此外,用例不仅限于父子类,而是可以将这个实用函数用于适配器用例。
PS- A 和 B 是第三方类,我只能使用这些类,所以我不能做任何修改 在 A 和 B 中。
【问题讨论】:
-
声明一个接受
A的B构造函数。 -
您希望得到的
B是什么样子?只需将A的字段设置为 null 的A实例的副本? -
对我来说听起来像是一个 XY 问题...您要解决的真正问题是什么?我无法想象任何像样的用例可以尝试这样做。
-
@Alnitak - 一个不错的用例可能是例如基于通用
List创建一个特定的XXXList。虽然你可能是对的 - 我也很怀疑 OP 的动机:) -
如果不显式调用
setName和setAge,就无法设置B的名称和年龄,因为B没有采用名称和年龄作为参数。顺便说一句,instanceOfA.getPhone()是一个编译错误,因为A没有phone或getPhone。
标签: java inheritance instantiation