我正在尝试创建一个自定义类创建矩阵,除其他外,执行添加所有单元格或将它们全部相乘的操作。但是,我想使用泛型,因此矩阵可以是任何类型的数字: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];
}
}
然而,我遇到了多个问题。首先,我无法将结果初始化为零,这使得执行+ =操作变得困难。其次,当我尝试添加两个矩阵的单元格时,编译器告诉我+类型为num的+运算符。
我认为泛型的全部意义是要有一个类型,所以我可以做一些事情,比如在一个案例中使用浮点数,在另一个案例中使用ints,但如果我需要为+等运算符指定类型,我不确定优势来自......
答案 0 :(得分:1)
您无法对对象执行+
和-
等操作(某些特殊情况除外)。泛型都是关于对象类型的,所以你的用例并不理想。
也就是说,您可以将声明转换为public class Matrix<num extends Number>
,这样您就可以通过Integer
,Double
,BigInteger
等等,然后就可以了使用num.longValue()
或num.doubleValue()
之类的内容来获取数字的长或双重表示。然而,您需要从您的方法返回double
或long
或其他任何内容,而不是您的泛型类型。
另一个选项是创建一个自定义容器类,其中包含add,subtract等方法。然后,您的类声明可以是public class Matrix<num extends Custom>
。你必须弄清楚如何考虑将长篇添加到双打并返回自定义类型。
答案 1 :(得分: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
,或者创建一个通用程序来检查Number与“instanceof”的类型。它不是很漂亮:P