java - 复制任何类型的对象

标签 java copy clone

我有以下内容。

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/

相关文章:

rust - 如何移出作为选项的结构字段?

java - x.clone().equals(x) 为何为 True

java - 代号 One android 构建失败

java - 使用 XMLWorker 生成目录

Java在两个给定值之间生成随机数

copy - std.algorithm.copy 和 std.digest

c++ - 不可变数据结构还是 const 变量?

c# - 深度克隆对象后清除主键

java - Java中如何实现包含对象数组的对象的深拷贝?

JavaFX:如何在 XY 线图的 Y 轴上正确实现 `getValueForDisplay()`?