我有以下内容。
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 的副本?
修订 - 为了更清楚,我将粘贴我的代码。
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 extends Cloneable,但这是行不通的。我相信实现 Cloneable 并不能确保克隆可见。
注意:注意重复!
对于那些将此标记为重复的人,请阅读问题。这是要求一种复制未知类型对象的方法。无论如何,根据我的了解,这是不可能的。感谢大家的意见。
最佳答案
如果您完全不知道 T 是什么,您能做的最好的事情就是测试它是否实现了 Cloneable
和 .clone()
。
if (originalObject implements Cloneable) {
T modifiedObject = originalObject.clone();
// ...
} else {
throw new IllegalArgumentException();
}
您还可以限制T
:
public static <T extends Cloneable> T someMethod(T originalObject) {
T modifiedObject = originalObject.clone();
}
无论如何,您如何指望修改一个您完全不知道它是什么的对象?你的用例听起来有点奇怪。如果您描述您正在尝试做什么(而不是如何您尝试做这件事),可能会更容易提供帮助。
关于java - 复制任何类型的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15780044/