1

タイトルが示すように、多次元配列、正確には2次元配列のコピーを一般的な方法で作成しようとしているので、他の場所でこれを再利用できます。

私が渡すタイプは、おそらくすべてユーザー定義です。たとえば、この方法で利用したい Tile クラスがあります。

私の現在の問題は以下のコードです:

デバッガーで呼び出しを追跡し、配列内の要素が正しく割り当てられていることを確認できますが、結果が返されるとすぐに Java は次の例外をスローします。

java.lang.ClassCastException: [[Ljava.lang.Object; [[Lboard.Tile; にキャストできません。

@SuppressWarnings("unchecked")
public static <T> T[][] clone(T[][] source) {
    T[][] result = (T[][]) new Object[source.length][source[0].length];
    for (int row = 0; row < source.length; row++) {
        result[row] = Arrays.copyOf(source[row], source[0].length);
    }
    return result;
}

これを行う良い方法を知っている人はいますか?最適化は問題ではありません。

ありがとう

4

2 に答える 2

4

Here is my approach based on Array.copyOf()

static <T> T[][] clone(T[][] source) {
    Class<? extends T[][]> type = (Class<? extends T[][]>) source.getClass();
    T[][] copy = (T[][]) Array.newInstance(type.getComponentType(), source.length);

    Class<? extends T[]> itemType = (Class<? extends T[]>) source[0].getClass();
    for (int i = 0; i < source.length; i++) {
        copy[i] = (T[]) Array.newInstance(itemType.getComponentType(), source[i].length);
        System.arraycopy(source[i], 0, copy[i], 0, source[i].length);
    }
    return copy;
}

The trick is to obtain the type of the items and create arrays by explicitly specifying this type.

EDIT: don't forget to check if source is null :)

于 2013-04-06T01:49:42.360 に答える
1

結局、配列は typeObject[][]ではなくtype であるため、例外が発生しT[][]ます。次のように、リフレクションを使用してこれを回避できます (ただし、厄介です)。

T[][] result = (T[][]) java.lang.reflect.Array.newInstance(source[0][0].getClass(), new int[]{source.length, source[0].length});
于 2013-04-06T01:46:13.007 に答える