我正在尝试创建一个自定义类,用于创建矩阵,并执行将所有单元格相加或将它们全部相乘的操作。但是,我想使用泛型,因此矩阵可以是任何类型的数字:float、double、int 等。因此,我设置了这样的类:
public class Matrix<num>
Run Code Online (Sandbox Code Playgroud)
初始化时,此类的实例化根据用户提供的数据创建一个矩阵,存储在实例的 .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];
}
}
Run Code Online (Sandbox Code Playgroud)
然而,我遇到了多个问题。首先,我无法将结果初始化为零,这使得执行 += 操作变得困难。其次,当我尝试将两个矩阵的单元格相加时,编译器告诉我 + 运算符对于 num 类型未定义。
我认为泛型的全部意义在于拥有一个包罗万象的类型,这样我就可以在一种情况下使用浮点数,在另一种情况下使用整数,但是如果我需要为 + 等运算符指定类型,我不确定优势在哪里进来...
您不能对对象执行类似+和 的操作(某些特殊情况除外)。-泛型都是关于对象类型的,因此它们的用例并不理想。
也就是说,您可以将您的声明变成类似 的东西public class Matrix<num extends Number>,它会让您传入Integer、Double、BigInteger等,然后您可以使用类似num.longValue()或 的东西num.doubleValue()来获取数字的长或双表示形式。不过,您需要从您的方法返回 adouble或long或其他内容,而不是您的泛型类型。
另一种选择是创建一个自定义容器类,该类具有加、减等方法。然后您的类声明可以是public class Matrix<num extends Custom>. 您必须弄清楚如何将长整型添加到双精度型并返回自定义类型。