二元运算符'+'的坏操作数类型

时间:2013-05-09 16:27:56

标签: java generics generic-programming

我正在创建一个操纵Matrices的泛型类。但问题是:当我实现加法运算时,我得到“二元运算符的错误操作数类型'+'”

它说:

第一种类型:对象   第二种:T   其中T是一个类型变量:     T扩展在类Matrix

中声明的Object

有没有办法让它进行添加?

这是我的代码:

public class Matrix<T> {
    private T tab[][];
    public Matrix( T tab[][])
    {
       this.tab = (T[][])new Object[tab.length][tab[0].length];
       for(int i = 0; i < tab.length; i++){
            System.arraycopy(tab[i], 0, this.tab[i], 0, tab.length);
        }
    }

    public Matrix(int row, int column)
    {
       this.tab = (T[][])new Object[row][column];
    }

    //other constructors...

    public Matrix addition(Matrix otherMatrix)
    {
        Matrix tmp = new Matrix(otherMatrix.getRowLen(), otherMatrix.getColLen());
        for(int i = 0; i < tab.length; i++){
            for(int j = 0; j < tab[0].length; j++){
                //the line with the error is below
               tmp.setElement(i, j, otherMatrix.getElement(i, j) + tab[i][j]);
            }
        }

        return tmp;
    }

    public int getRowLen(){
        return tab.length;
    }

    public int getColLen(){
        return tab[0].length;
    }

    public void setElement(int i, int j, T value){
        tab[i][j] = value;
    }

    public void setElement( T tab[][])
    {
       this.tab = (T[][])new Object[tab.length][tab[0].length];
       for(int i = 0; i < tab.length; i++){
            System.arraycopy(tab[i], 0, this.tab[i], 0, tab.length);
        }
    }

    public T getElement(int i, int j){
        return tab[i][j];
    }
}

提前感谢!

2 个答案:

答案 0 :(得分:1)

Java不支持将+运算符用于除原始数字类型和Strings之外的任何内容。在这里,您不能在任意对象之间使用+运算符。

左侧有Object,因为otherMatrix是原始(无类型)Matrix。您的右侧有T,因为tab通常定义为T

您无法在Java中重载运算符,因此无法为任何+定义T

您可以通过删除泛型并使用

来获得所需内容
private int tab[][];

private double tab[][];

取决于您的需求。

答案 1 :(得分:0)

尽管数学运算符不适用于泛型类型(即使受Number限制,但请参阅suggested duplicate),您可以在创建矩阵时轻松传递数学运算策略。 / p>

 public class Matrix<T> {

    private final MathOperations<T> operations;

    public Matrix(T[][] data, MathOperations<T> operations) {
       //...
       this.operations = operations;
    }

        //...
        tmp.setElement(i, j, operations.add(otherMatrix.getElement(i, j), tab[i][j]));
 }

 public interface MathOperations<T> {
     public T add(T operand1, T operand2);
     //... any other methods you need defined
 }

 public class IntegerMathOperations implements MathOperations<Integer> {
     public Integer add(Integer i1, Integer i2) {
         //(assuming non-null operands)
         return i1 + i2;
     }
 }