我正在创建一个操纵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];
}
}
提前感谢!
答案 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;
}
}