2015-10-14 55 views
1

我在Java中創建了一個適用於int和float的Matrix類。爲此,我發現如果我能夠根據用戶傳遞給構造函數的參數將變量mat聲明爲int或float,將會非常方便。如何確定java中構造函數中變量的類型?

我目前的做法是:

package Matrix; 
public class Matrix 
{ 
    int row,col,mat[][]; 
    float fmat[][]; 
    boolean real=false; 
    public Matrix(int r,int c) 
    { 
     row=r; 
     col=c; 
     mat=new int[r][c]; 
    } 
    public int determinant() 
    { 
     //Code to calculate and return Determinant of mat 
    } 
} 

我只是想擺脫FMAT和墊子應該到其他的方法,如決定訪問。我知道我可以將int和float存儲在float類型的數組中,但由於某些原因,我不想要這樣。我也可以將類型設置爲Number或Object,但Integer或Float類的方法不適用於這些類型。如果有解決方案,請告訴我。任何替代解決方案也受到歡迎。謝謝。

+3

聽起來像'Matrix'應該是通用的。 – djechlin

+0

像@djechlin說的:使用泛型,你可以在這裏找到一個教程:https://docs.oracle.com/javase/tutorial/java/generics/why.html – Marged

+0

@被大概我仍然紫外線,因爲我不知道如何在Java中添加和相乘泛型(即強制它們是Integer或Float),並且我不確定如何根據函數參數是int還是float,以不同的方式路由代碼。 – djechlin

回答

0

爲什麼不使用通用? ,如: 矩陣,並宣佈墊爲:T [] []墊

+2

正如你已經花時間來回答一個答案:爲什麼不給他一個基於他的原代碼的例子? – Marged

2

正如其他用戶所指出的那樣,我也一樣,我建議你到你的抽象refactorize到通用一個帶有一個數字參數,代表所包含元素的類型:通過這種形式

public class Matrix<T extends Number> 
{ 
    private int rows; 
    private int cols; 
    private T[][] elements; 

    public T determinant() 
    { 
     ... 
    } 
} 

,編譯器將確保任何類型的位置參數T的設置將是Number一個子類。整個Matrix的定義可以使用參數化類型T

當你實現你的類,你可以使用這樣的:

Matrix<Integer> matrixOfIntegers=new Matrix<Integer>(10, 20); 
int determinant1=matrixOfIntegers.determinant(); 

Matrix<Double> matrixOfDoubles=new Matrix<Double>(10, 20); 
double determinant2=matrixOfDoubles.determinant(); 
+0

對於你的主要觀點來說並不是真正必要的,但是整數矩陣的行列式仍然是一個雙重的但是任何常用的單詞。 – Brick

+0

你說得對,但我已經將我的例子調整到OP,其中行列式返回一個'int'。無論如何,這是一個設計決定。 –

1

您可以使用泛型來完成這個做一些事情,通過@addigo的建議。如果你的應用程序有性能要求,我個人建議不要這樣做,要麼做你正在做的事情,要麼寫兩個單獨的課程。這可能是因爲你不會使用泛型的性能問題,但我的首要位置是擔心編譯器不會通過可能導致的自動拆箱來優化計算(或者如果你這樣做,明確拆箱)。

要精心,如果使用仿製藥,最直接的辦法是做這樣聲明:

public class Matrix<T extends Number> { 
    private T[][] mat; 

    // Rest of class 
} 

這本身並不壞。但是,接下來你會看到像「add」方法這樣的簡單例子。這是怎麼回事,看起來像這樣

public Matrix<T> add(Matrix<T> m) { 
    // Check for consistency of matrix dimensions 
    T[][] sum = new double[getRowDim()][getColDim()]; 
    for(int i = 0; i < getRowDim(); ++i) { 
     for(int j = 0; j < getColDim(); ++j) { 
      sum[i][j] = mat[i][j] + m.mat[i][j]; // Auto unboxing happens here 
     } 
    } 
    return new Matrix(sum); 
    } 

我在這裏提出關於其他方法的一些假設,我沒有明確的定義,但其意義應該是顯而易見的。 (還有一些其他的優化,我爲了清晰和簡潔而略過。)

您還會遇到一些問題,正確處理您想要添加Matrix<Float>類型的對象的情況,請輸入Matrix<Integer>。這些都不是不可逾越的,但我認爲他們會開始打敗你首先使用泛型的好處。

只是我的意見,當然。如果您不關心速度,或者您確信編譯器足以解決問題,那麼仿製藥仍然是一個不錯的選擇。

相關問題