将复制任何多维数组的通用函数

时间:2013-04-06 01:30:57

标签: java arrays generics copy

就像标题所说的那样,我试图以通用的方式创建一个多维数组的副本,确切地说是二维数组,所以我可以在其他地方重用它。

我将通过它的类型最有可能是用户定义的,例如我有一个我希望以这种方式使用的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;
}

有人知道这样做的好方法吗?优化不是问题。

由于

2 个答案:

答案 0 :(得分:3)

这是我基于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;
}

技巧是获取项的类型并通过显式指定此类型来创建数组。

编辑:不要忘记检查源是否为空:)

答案 1 :(得分:1)

发生异常,因为毕竟数组仍然是Object[][]类型而不是类型T[][]。你可以通过使用反射来解决这个问题,就像这样(但它很讨厌):

T[][] result = (T[][]) java.lang.reflect.Array.newInstance(source[0][0].getClass(), new int[]{source.length, source[0].length});