2016-03-30 9 views
4

私はマトリックスライブラリ(教育目的)を作成しようとしており、障害に達しています猶予でアプローチする方法がわかりません。 2つの行列を追加するのは簡単な作業です。それぞれの行列の要素ごとにget()メソッドを個別に使用します。抽象クラスメソッド - 子クラスオブジェクトをインスタンス化するには?

しかし、私が使った構文は間違っています。 NetBeansはクラスを期待していると主張していますが、型パラメータを見つけました。私には、型パラメータは、クラスのセットへの1:1マッピングを持つ単なるセットです。

ここで私は間違っていますか?私は以前に型パラメータがクラス以外の何かであることは見たことがないので、次のビットはMをクラスとするべきではないでしょうか?

Mがマトリックス

public abstract class Matrix<T extends Number, M extends Matrix> 
{ 
    private int rows, cols; 
    public Matrix(int rows, int cols) 
    { 
     this.rows = rows; 
     this.cols = cols; 
    } 

    public M plus(Matrix other) 
    { 
     // Do some maths using get() on implicit and explicit arguments. 
     // Store result in a new matrix of the same type as the implicit argument, 
     // using set() on a new matrix. 
     M result = new M(2, 2); /* Example */ 
    } 

    public abstract T get(int row, int col); 
    public abstract void set(int row, int col, T val); 
} 
+1

Matrixクラスには、それ自体が拡張された型があるのはなぜですか? –

+0

@ cricket_007私の推論は、関数plus()は、そのクラスがMatrixを継承しているオブジェクトを返すべきだと考えています。私がそれを打ち明けると、本当にばかげて聞こえます。たぶん、戻り値の型は単に行列でなければなりません。しかし、私はplus()関数の中で行列をインスタンス化できません。それは抽象クラスなので。 –

+2

正確な型がわからないので、型パラメータ 'M'を直接インスタンス化することはできません。 – Andrew

答えて

2

型パラメータMは、正確な型がわからないため直接インスタンス化できません。


私は、次のような方法

public abstract <M extends Matrix> M plus(M other); 

およびサブクラスでの実装を作成することを考え示唆しています。

0

を拡張し、私はあなたのMが必要だとは思いません。

MのサブクラスがMatrixの場合、定義にはMatrixを使用してください。

public abstract class Matrix<T extends Number> 
{ 
    private int rows, cols; 
    public Matrix(int rows, int cols) 
    { 
     this.rows = rows; 
     this.cols = cols; 
    } 

    public Matrix<T> plus(Matrix<T> other) 
    { 
    } 

    public abstract T get(int row, int col); 
    public abstract void set(int row, int col, T val); 
} 
0

次のコードが間違っている:

M result = new M(2, 2); 

Mは、あなたがインスタンス化できるクラスではありません。

Matrixクラスがabstractであり、どちらもインスタンス化できないため、基本的にはデータ構造を少し変更する必要があります。

返品タイプをplusからMatrixに変更して抽象的にしておくことをお勧めします。

2

あなたのコードから、Matrixから子クラスをいくつか拡張して計算したいと思います。それぞれの子クラスで

public abstract class Matrix<T extends number> { 
    ... 
    public abstract Matrix plus(Matrix other); 
    ... 
} 

変更、プラスの実装を追加します。子クラスの構築機能のために定義されています。

関連する問題