在矩阵加法/乘法中使用泛型

时间:2013-01-31 20:29:25

标签: java

我正在尝试创建一个自定义类创建矩阵,除其他外,执行添加所有单元格或将它们全部相乘的操作。但是,我想使用泛型,因此矩阵可以是任何类型的数字: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,但如果我需要为+等运算符指定类型,我不确定优势来自......

2 个答案:

答案 0 :(得分:1)

您无法对对象执行+-等操作(某些特殊情况除外)。泛型都是关于对象类型的,所以你的用例并不理想。

也就是说,您可以将声明转换为public class Matrix<num extends Number>,这样您就可以通过IntegerDoubleBigInteger等等,然后就可以了使用num.longValue()num.doubleValue()之类的内容来获取数字的长或双重表示。然而,您需要从您的方法返回doublelong或其他任何内容,而不是您的泛型类型。

另一个选项是创建一个自定义容器类,其中包含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