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

标签 java arrays generics copy

正如标题所说,我正在尝试创建一个多维数组的副本,准确地说是二维数组,以一种通用的方式,以便我可以在其他地方重用它。

我将传递给它的类型很可能都是用户定义的,例如我有一个我希望以这种方式使用的 Tile 类。

我目前的问题是下面的代码:

在调试器中,您可以跟踪调用并看到数组中的元素被正确分配,但是一旦返回结果,java 就会抛出此异常:

java.lang.ClassCastException: [[Ljava.lang.Object; cannot be cast to [[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;
}

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

谢谢

最佳答案

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

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

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

关于java - 将复制任何多维数组的通用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15846049/

相关文章:

java - AES 生成的 key 的默认大小是多少?

java: 为什么比较。当我在声明期间使用 {} 初始化数组时出错

f# - 在不同的泛型实例中实现相同的接口(interface)

java - Google App Engine - 仅对 POST 方法应用安全约束?

java - android中找不到文件异常

javascript - 查找数组中出现频率最高的项目(不仅仅是字符串)

c - 尝试传递递归函数来填充二维数组时出现段错误

Java 名称冲突错误

c# - 为泛型写一个扩展方法

java - 如何使用 lambda 表达式基于一个变量对对象列表进行排序?