2016-03-20 9 views
0

2D配列のディープコピーを作成する必要があります。私はこれを行う方法を知っていますJava Reflection(これを語る方法は不明ですが、詳細は内部をご覧ください)

int[][] a = new int[original.length][]; 
for(int i = 0; i < original.length; i++) { 
    a[i] = Arrays.copyOf(original[i], original[i].length); 
} 

しかし、今私はコピーしている配列のObject型を知らない位置にいます。私はそのようなメソッドを持っています

これは配列の配列である場合、元のディープコピーを返すべきです。メソッドにint [] []が与えられていれば、配列のObjectにキャストできません(プリミティブ型なので)。

現在、私は「オリジナル」そう

if(original==null||original.length==0||!original.getClass().getName().startsWith("[")) { 
    return null; 
} 

のような2次元配列がある。しかし、今、私は未知のタイプの配列のディープコピーを行う方法についてわからないんだかどうかを確認することができます。私はJava Reflectionを使う必要があると思っていますが、私はこれについてどうやって行くのか100%確信していません。

参考

、これは、INT [] [](または任意のプリミティブ[])Objectにキャストすることができない私の元の試み残念ながら

public Object[] copy(Object[] original) { 
    if(original==null||original.length==0||!original[0]getClass().getName().startsWith("[")) { 
     return null; 
    } 
    Object[][] returnArray = new Object[original.length][]; 
    for(int i = 0; i < original.length; i++) { 
     returnArray[i] = Arrays.copyOf((Object[]) original[i], ((Object[]) original[i]).length); 
    } 
    return returnArray 
} 

、でした。

+0

は、任意のタイプのためではないあなたの方法作業を行いますか? –

+0

@ YassinHajaj私が最初に試みたのは、コピーを作成するたびにキャストしようとすることでした。プリミティブ型はオブジェクトにキャストできません。 –

+0

私の意見では、CustomObjectTypeをObjectから変換することは、これまでのところCustomObjectServiceの仕事です。 (反射が高価であることを知っていなければなりません!)。 java.lang.Class(CustomObjectType.class)**のパラメータを渡すか、オブジェクト(ジェネリックス)としてパラメータを受け取り、型キャストした後に返すことを検討してください。 –

答えて

1

配列は、すべてのプリミティブのためcopyOf機能を持っているように私には、プリミティブのためのスイッチで解決策を考えることができます:

public static Object[] copyDeep(Object[] original) { 
    Object[] newArray = Arrays.copyOf(original, original.length); 
    if (newArray.getClass().getComponentType().isArray()) { 
     for (int i = 0; i < newArray.length ; i++) { 
      switch (newArray[i].getClass().getComponentType().getSimpleName()) { 

      case "int" : newArray[i] = Arrays.copyOf((int[])newArray[i],Array.getLength(newArray[i])); 
       break; 

      case "float" : newArray[i] = Arrays.copyOf((float[])newArray[i],Array.getLength(newArray[i])); 
       break; 
      // TODO other primitives 

      default: newArray[i] = Arrays.copyOf((Object[])newArray[i],Array.getLength(newArray[i])); 
      } 
     } 
    } 
    return newArray; 
} 

`

関連する問題