私は次のものを持っています。
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 を実装しても、クローンが確実に表示されるわけではないと思います。
注: 重複に注意してください!
これを重複としてマークする人は、質問を読んでください。これは、不明なタイプのオブジェクトを複製する方法を求めています。とにかく、私が理解したことから、これは不可能です。ご意見をお寄せいただきありがとうございます。