2016-03-30 97 views
4

我試圖創建一個矩陣庫(教育目的),並已達到障礙,我不知道如何處理寬限。添加兩個矩陣是一項簡單的任務,對每個矩陣的元素分別使用方法get()抽象類方法 - 實例化子類對象?

但是,我使用的語法是錯誤的。 NetBeans聲稱它期待一個類,但發現一個類型參數;對我而言,類型參數只是一組1:1映射到類的集合。

爲什麼我在這裏錯了?我從來沒有見過類型參數比以前的任何類別都要多,所以下面的內容不應該暗示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的對象。現在我輸入它真的很愚蠢。也許返回類型應該是Matrix ..但是我不能在plus()函數中實例化一個矩陣,對吧?因爲它是一個抽象類。 –

+2

你不能直接實例化一個類型參數'M',因爲你不知道它的確切類型。 – Andrew

回答

2

您不能直接實例化類型參數M,因爲您不知道它的確切類型。


我建議考慮建立以下方法

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

及其在子類實現。

0

我不認爲你的M是必要的。

如果MMatrix的子類,那麼只需在您的定義中使用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); 
    ... 
} 

在每個子類中,添加執行加。因爲子類的構造函數在那裏定義。