Casting Generic 2d array Java 8

时间:2016-02-26 04:15:15

标签: java arrays object multidimensional-array casting

我在尝试投射通用二维数组时遇到错误,任何提示?

    public E[][] multiplyMatrix(E[][] matrix1, E[][] matrix2) {

    // Check bounds
    if (matrix1[0].length != matrix2.length) {
        throw new RuntimeException(
                "The matrices do not have compatible size");
    }

    // Create result matrix
    E[][] result = (E[][])new Object[matrix1.length][matrix2[0].length];

    // Perform multiplication of two matrices
    for (int i = 0; i < result.length; i++) {
        for (int j = 0; j < result[0].length; j++) {
            result[i][j] = zero();

            for (int k = 0; k < matrix1[0].length; k++) {
                result[i][j] = plus(result[i][j],
                        multiply(matrix1[i][k], matrix2[k][j]));
            }
        }
    }

    return result;
}

这是我的错误

java.lang.ClassCastException: java.lang.Object; cannot be cast to java.lang.Double;

1 个答案:

答案 0 :(得分:0)

(E[][])new Object[matrix1.length][matrix2[0].length]

我猜你某处有这样的事情:

Double[][] result = multiplyMatrix(m1, m2); // m1 & m2 are also Double[][]

所以,如果您认为以下内容是个好主意,那么您必须告诉我:

(Double[][])new Object[n][n]

如果你同意这似乎是一个坏主意,那么你理解为什么你会得到一个例外,除非未经检查的演员模糊了正在发生的事情。

如果您想要使用正确的类型创建数组,则需要使用Arrays.copyOfgetComponentType / Array.newInstance。但这并没有完全解决问题,因为没有什么能阻止你用不兼容的数组参数调用multiplyMatrix。试试看我的意思:

multiplyMatrix(new Double[1][1], new Integer[1][1]);

就我个人而言,我建议不要一直尝试数学,因为仿制药不是为它而设计的,它充满了更多的陷阱。或者可以使用现有的库,因为我很确定那里有一些库。