2013-01-31 65 views
3

我試圖創建一個自定義類創建矩陣,並且除其他外,執行將所有單元相加或將它們全部相加的操作。然而,我想使用泛型所以基質可以是任何類型的號碼的:浮點,雙精度,整型,等。因此我已經設置了類這樣的:在矩陣加法/乘法中使用泛型

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

但是,我遇到了多個問題。首先,我無法將結果初始化爲零,這使得難以執行+ =操作。其次,當我嘗試添加兩個矩陣的單元格時,編譯器告訴我+類型num的操作符未定義。

我認爲泛型的全部觀點是有一個catchall類型,所以我可以做一些事情,比如在一個case中使用float和在另一個case中使用int,但是如果我需要爲+等操作符指定類型,我不會確定優勢來自何處...

+0

因爲你只做加法或任何有點arthematic操作我建議你使用通配符upperbounds。即,您可以使您的類聲明爲'public class Matrix { ' – PermGenError

+0

不起作用。 – cybye

+0

@PremGenError請注意,抽象類'Number'沒有多大用處,它主要是接口來從基本類型的Object版本中獲取值。會指定'Num extends Number'啓用自動裝箱? –

回答

1

您無法在對象上執行像+-這樣的操作(某些特殊情況除外)。泛型是關於對象類型的,所以你的用例並不理想。

這就是說,你可以把你的宣言變成像public class Matrix<num extends Number>,這將讓你在Integer傳遞,DoubleBigInteger,等等,那麼你就可以使用類似num.longValue()num.doubleValue()得到的長或double表示您數字。不過,您需要返回doublelong或其他任何來自您的方法而不是您的泛型類型。

另一種選擇是創建一個自定義容器類,該類具有添加,減少等方法。然後,您的類聲明可以是public class Matrix<num extends Custom>。你將不得不弄清楚如何考慮添加長整數和返回自定義類型。

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」什麼類型的數量。這不是很漂亮:P