【发布时间】:2013-03-24 16:30:32
【问题描述】:
我有以下。
public static <T> T someMethod(T originalObject) {
T modifiedObject = /* copy of original object (HOW DO YOU DO THIS?) */
/* Some logic that modifies the object. */
...
return modifiedObject; // without changing original Object
}
那么问题来了,如果您不知道 T 可能是什么类型,如何创建 T 类型的副本?
REVISION - 为了更清楚,我将粘贴我的代码。
public class ObjectMerger {
public static <T> T merge(T original, T patch) throws IllegalArgumentException, IllegalAccessException {
Object mergedObject = original // TODO: implement a way to copy original
Field[] inheritedFields = patch.getClass().getFields();
Field[] memberFields = patch.getClass().getDeclaredFields();
Field[] allFields = (Field[]) ArrayUtils.addAll(inheritedFields, memberFields);
for (Field field : allFields) {
Boolean originalAccessibility = field.isAccessible();
field.setAccessible(true);
Object fieldValue = field.get(patch);
if (fieldValue != null) {
Boolean fieldIsFinal = Modifier.isFinal(field.getModifiers());
if (!fieldIsFinal) {
field.set(mergedObject, fieldValue);
}
}
field.setAccessible(originalAccessibility);
}
return mergedObject;
}
}
注意:我曾尝试说 T 扩展 Cloneable,但这是不行的。我相信实现 Cloneable 并不能确保克隆是可见的。
注意:注意重复!
对于那些将其标记为重复的人,请阅读问题。这是在寻求一种方法来复制未知类型的对象。无论如何,据我所知,这是不可能的。感谢大家的意见。
【问题讨论】:
-
你要克隆对象吗?
-
您能否进一步解释一下您为什么要这样做?这样我们就可以向您建议一些正确的方法。
-
我修改了我的问题。我希望这让它更清楚一点。谢谢。
-
另一个思路:检查对象是否实现
Serializable。如果是,则序列化然后反序列化为不同的对象。