1

マトリックスを操作するジェネリック クラスの作成に取り組んでいます。しかし、ここに問題があります。加算演算を実装すると、「二項演算子 '+' の不適切なオペランド型」が発生します。

次のように述べています。

最初の型: オブジェクト 2 番目の型: T (T は型変数): T extends Object クラスで宣言された Matrix

追加を行う方法はありますか?

ここに私のコードがあります:

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];
    }
}

前もって感謝します !

4

2 に答える 2

1

Java は+、プリミティブ数値型およびStrings. +ここでは、任意のオブジェクト間で演算子を使用できません。

は raw (untyped) であるObjectため、左側にがあります。は で一般的に定義されているため、右側にがあります。otherMatrixMatrixTtabT

Java では演算子をオーバーロードできないため、 を+定義することはできませんT

ジェネリックを削除して使用することで、必要なものを取得できる場合があります

private int tab[][];

また

private double tab[][];

あなたのニーズに応じて。

于 2013-05-09T16:31:57.893 に答える
1

数学演算子はジェネリック型には適していませんが ( によって制限されている場合でも、提案された複製Numberを参照してください)、行列を作成するときに数学演算の戦略を簡単に渡すことができます。

 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;
     }
 }
于 2013-05-09T17:20:06.347 に答える