5

我正在尝试创建一个自定义类来创建矩阵,并且除其他外,执行将所有单元格相加或将它们全部相乘的操作。但是,我想使用泛型,因此矩阵可以是任何类型的数字:float、double、int 等。因此我设置了这样的类:

public class Matrix<num>

初始化时,此类的实例化基于用户提供的数据创建一个矩阵,存储在实例的 .matrix 变量中。现在,在我想要添加所有单元格的代码中,我执行以下操作:

public num addMatrices(num[][] toAdd){
        num result;
        if (toAdd.length != this.rows && toAdd[0].length != this.columns){
            System.out.println("Matrix mismatch. Try Again.");
            return toAdd[0][0];
        }
        for (int i=0; i<rows; i++)
            for (int j=0; j<rows; j++){
                result = this.matrix[i][j] + toAdd[i][j];
            }
    }

但是,我遇到了多个问题。首先,我无法将 result 初始化为零,这使得执行 += 操作变得困难。其次,当我尝试添加两个矩阵的单元格时,编译器告诉我 + 运算符对于类型 num 是未定义的。

我认为泛型的全部意义在于拥有一个包罗万象的类型,这样我就可以在一种情况下使用浮点数和在另一种情况下使用整数,但是如果我需要为 + 等运算符指定类型,我不确定优势在哪里进来...

4

2 回答 2

1

您不能对对象执行诸如+和之类的操作-(某些特殊情况除外)。泛型都是关于对象类型的,因此您对它们的用例并不理想。

也就是说,您可以将您的声明变成类似 的东西public class Matrix<num extends Number>,这样您就可以传入Integer, Double,BigInteger等。然后您可以使用类似num.longValue()or的东西num.doubleValue()来获取数字的长或双表示。然后,您需要从您的方法中返回 a doubleorlong或任何内容,而不是您的泛型类型。

另一种选择是创建一个自定义容器类,该类具有加法、减法等方法。然后你的类声明可以是public class Matrix<num extends Custom>. 您必须弄清楚如何将 long 添加到 double 并返回 Custom 类型。

于 2013-01-31T20:47:11.840 回答
0

问题是你num可以成为任何人。因此,例如,如果您创建了一个Matrix<Object>?

您可以尝试使您的号码从 扩展Number,但即使那样您也无法使用+,因为 java 不知道将这个泛型转换为什么。

您可以创建一个类似于您Matrix的通用方法来执行此操作。就像是

public static <NUM extends Number> NUM add(NUM[][] matrixA, NUM[][] matrixB, NumFunction<NUM> function) {
    // all equals to your add method, but the result you get with
    result = function.apply(this.matrix[i][j], toAdd[i][j]);
}

public interface NumFunction<NUM extends Number> {
    NUM apply(NUM operA, NUM operB);
}

您将需要复制NumFunction到每种类型Number,或创建一个泛型来检查“instanceof”是什么类型的 Number。这不是很漂亮:P

于 2013-01-31T20:50:35.173 回答