我正在尝试创建一个自定义类,该类创建矩阵,并执行将所有单元格相加或相乘的操作。但是,我希望使用泛型,因此矩阵可以是任何类型的数字:浮点数、双精度数、整型数等。因此,我像这样设置了类:
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类型定义+运算符。
我认为泛型的全部意义在于拥有一个catchall类型,这样我就可以做一些事情,比如在一种情况下使用浮点型,在另一种情况下使用整型,但是如果我需要为+这样的运算符指定类型,我不确定优势在哪里……
发布于 2013-01-31 20:47:12
你不能对对象执行像+
和-
这样的操作(一些特殊情况除外)。泛型都是关于对象类型的,所以你的用例并不理想。
也就是说,您可以将声明转换为类似public class Matrix<num extends Number>
的形式,这将允许您传入Integer
、Double
、BigInteger
等,然后您可以使用类似num.longValue()
或num.doubleValue()
的形式来获得数字的长表示或双精度表示。但是,您需要从您的方法返回一个double
或long
或其他类型,而不是您的泛型类型。
另一种选择是创建一个自定义容器类,其中包含add、subtract等方法。然后,您的类声明可以是public class Matrix<num extends Custom>
。您必须弄清楚如何说明如何将长整型添加到doubles并返回Custom类型。
发布于 2013-01-31 20:50:35
问题是你的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“是哪种类型的数字。它不是很漂亮:P
https://stackoverflow.com/questions/14634535
复制相似问题