5

行列を作成するカスタム クラスを作成しようとしています。とりわけ、すべてのセルを加算または乗算する操作を実行します。ただし、ジェネリックを使用して、行列を任意の型の数値 (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];
            }
    }

しかし、私は複数の問題に直面しています。まず、result をゼロに初期化できないため、+= 操作を実行するのが難しくなります。次に、2 つの行列のセルを追加しようとすると、コンパイラは + 演算子が型 num に対して未定義であると通知します。

ジェネリックの要点はキャッチオール型を持つことだと思っていたので、ある場合は float を使用し、別の場合は int を使用することができましたが、+ のような演算子の型を指定する必要がある場合、どこに利点があるのか​​ わかりません入って来る...

4

2 に答える 2

1

+オブジェクトに対してや などの操作を実行することはできません-(一部の特殊なケースを除く)。ジェネリックはすべてオブジェクト型に関するものであるため、それらのユースケースは理想的ではありません。

そうは言っても、宣言を のようなものに変えることができます。これにより、、 、 などpublic class Matrix<num extends Number>を渡すことができます。その後、orのようなものを使用して、数値の long 表現または double 表現を取得できます。ただし、ジェネリック型ではなく、メソッドからorなどを返す必要があります。IntegerDoubleBigIntegernum.longValue()num.doubleValue()doublelong

もう 1 つのオプションは、加算、減算などのメソッドを持つカスタム コンテナ クラスを作成することです。その場合、クラス宣言はpublic class Matrix<num extends Custom>. double に long を追加して Custom 型を返す方法を理解する必要があります。

于 2013-01-31T20:47:11.840 に答える
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か、「instanceof」で Number のタイプをチェックするジェネリックを 1 つ作成する必要があります。それはあまりきれいではありません:P

于 2013-01-31T20:50:35.173 に答える