1

私は次のものを持っています。

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 を実装しても、クローンが確実に表示されるわけではないと思います。

注: 重複に注意してください!

これを重複としてマークする人は、質問を読んでください。これは、不明なタイプのオブジェクトを複製する方法を求めています。とにかく、私が理解したことから、これは不可能です。ご意見をお寄せいただきありがとうございます。

4

5 に答える 5

2

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();
}

いずれにせよ、それが何であるかまったくわからないオブジェクトを変更することをどのように期待できますか? あなたのユースケースは少し奇妙に聞こえます。何をしようとしているのか (どのようにしようとしているのかではなく)を説明していただけると、助けやすくなります。

于 2013-04-03T06:13:04.347 に答える
1

XStream を使用する準備ができている場合、ここに解決策があります。

XStream xstream = new XStream();

return (T) xstream.fromXML(XSTREAM.toXML(originalObject));
于 2013-04-03T06:23:25.030 に答える
1

タイトルがCopy Object of Any Typeと言うように、あなたが持っている唯一のオプションはReflection APIを使用することだと思います。また、リフレクションを使用する場合でも、コピーを作成する対象に応じて、ソース オブジェクトからコピーする属性など、いくつかの基準が必要です。

于 2013-04-03T06:30:22.573 に答える
1

問題は、タイプがT何であるかわからない場合に、タイプのコピーを作成する方法です。T

Tが何なのかまったくわからない場合は、コピーを作成することはまったくできません。

まず、オブジェクトをコピーするためのユニバーサル API はありません (任意の型が をサポートする場合とサポートしない場合がありclone()ます)。

ただし、主な理由は、Tコピーがまったくサポートされていない可能性があることです。たとえば、TFileInputStream? そのインスタンスをどのようにコピーすると思いますか?

/* Some logic that modifies the object. */さらに、何がわからない場合、どのように実装しますTか?

于 2013-04-03T06:14:56.737 に答える
0

次の 2 つのオプションがあります。

  • を使用しclone()Cloneable他の回答で既に提案されているように
  • Cloneable に制限したくない場合は、リフレクションを使用するディープ/シャロー クローン ライブラリを使用します。推奨されませんが、オプションです)。オブジェクトがコピーをサポートしていることに注意する必要があります。
于 2013-04-03T06:16:10.323 に答える