Java泛型和数字

Sco*_*mke 18 java generics

试图看看我是否可以清理我的一些数学代码,主要是矩阵的东西,我试图使用一些Java泛型.我有以下方法:

private <T> T[][] zeroMatrix(int row, int col) {
    T[][] retVal = (T[][])new Object[row][col];
    for(int i = row; i < row; i++) {
        for(int j = col; j < col; j++) {
            retVal[i][j] = 0;
        }
    }
    return retVal;
}
Run Code Online (Sandbox Code Playgroud)

retVal [i] [j] = 0行是引起头痛的行.该行的目标是使用T表示为0初始化数组.我试图用它做各种各样的事情:(T在类中被定义为T extends Number)

retVal[i][j] = (T)0;
retVal[i][j] = new T(0);
Run Code Online (Sandbox Code Playgroud)

唯一有效的是

retVal[i][j] = (T)new Object(0);
Run Code Online (Sandbox Code Playgroud)

这不是我想要的.

这可能吗?有没有更简单的方法来表示任何类型的数字的NxM矩阵(包括可能的BigDecimal),还是我被困?

dfa*_*dfa 12

<T extends Number> T[][] zeroMatrix(Class<? extends Number> of, int row, int col) {
    T[][] matrix = (T[][]) java.lang.reflect.Array.newInstance(of, row, col);
    T zero = (T) of.getConstructor(String.class).newInstance("0");
    // not handling exception      

    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; 
            matrix[i][j] = zero;
        }
    }

    return matrix;
}
Run Code Online (Sandbox Code Playgroud)

用法:

    BigInteger[][] bigIntegerMatrix = zeroMatrix(BigInteger.class, 3, 3);
    Integer[][] integerMatrix = zeroMatrix(Integer.class, 3, 3);
    Float[][] floatMatrix = zeroMatrix(Float.class, 3, 3);
    String[][] error = zeroMatrix(String.class, 3, 3); // <--- compile time error
    System.out.println(Arrays.deepToString(bigIntegerMatrix));
    System.out.println(Arrays.deepToString(integerMatrix));
    System.out.println(Arrays.deepToString(floatMatrix));
Run Code Online (Sandbox Code Playgroud)

编辑

通用矩阵:

public static <T> T[][] fillMatrix(Object fill, int row, int col) {
    T[][] matrix = (T[][]) Array.newInstance(fill.getClass(), row, col);

    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++) {
            matrix[i][j] = (T) fill;
        }
    }

    return matrix;
}    

Integer[][] zeroMatrix = fillMatrix(0, 3, 3); // a zero-filled 3x3 matrix
String[][] stringMatrix = fillMatrix("B", 2, 2); // a B-filled 2x2 matrix
Run Code Online (Sandbox Code Playgroud)


ben*_*din 8

数组和泛型不能很好地结合在一起:

"数组是协变的,这意味着超类型引用数组是子类型引用数组的超类型.也就是说,它Object[] 是一个超类型,String[] 字符串数组可以通过类型的引用变量访问Object[]."

请参阅Java Generics FAQ:


Tom*_*ine 1

旧的(参考)数组不能很好地与泛型配合使用。在这种情况下,数组也可能效率低下。您正在创建一个数组的数组,因此存在不必要的间接和边界检查。最好去上课Matrix<T>。您可能还想添加对代表零的Matrix实例的引用。T