2014-11-05 47 views
2

我想從提供的數組(二維數組)減去值。我想通過使用泛型來做。任何人都可以幫助我的代碼有什麼問題。我的意思是我需要延續一些課程嗎?我得到的錯誤(運算符 - 是不明確的參數類型(S)T,T)Java減去通用值運算符減去未定義

在此先感謝。

//this method Subtracts Value from the given Matrix for all the rows but for given columns 
private <T> void subtractValueFromColumns(T[][] matrix, 
     ArrayList<Integer> columnsIndex, T value) { 

    for(int i = 0; i < matrix.length; i++){ 
     for(int j = 0; j < columnsIndex.size(); j++){ 
      matrix[i][j] = matrix[i][j] - value; 
     } 
    } 

} 
+1

所以會發生什麼,如果我叫:'subtractValueFromColumns(新的String [] [] {{「一」,「 b「,」c「},{」d「,」e「,」f「}},new ArrayList (),」z「)'? – immibis 2014-11-05 10:04:51

回答

1

您需要定義可在該給定類型上使用的操作和方法。

public interface ArithmeticOps<T extends ArithmeticOps<T>> 
{ 
    T add(T other); 
    T subtract(T other); 
    T divide(T other); 
    T multiply(T other); 
} 

private <T extends ArithmeticOps<T>> void subtractValueFromColumns(T[][] matrix, 
     List<Integer> columnsIndex, T value) { 
    for(int i = 0; i < matrix.length; i++){ 
     for(int j = 0; j < columnsIndex.size(); j++){ 
      matrix[i][j] = matrix[i][j].subtract(value); 
     } 
    } 
} 

它與LibGDX如何執行Vector操作相似。

https://github.com/libgdx/libgdx/blob/master/gdx/src/com/badlogic/gdx/math/Vector.java

public interface Vector<T extends Vector<T>> { 
    /** Scales this vector by a scalar 
    * @param scalar The scalar 
    * @return This vector for chaining */ 
    T scl (float scalar); 

    T add (T v); 
} 

https://github.com/libgdx/libgdx/blob/master/gdx/src/com/badlogic/gdx/math/Vector2.java

public class Vector2 implements Serializable, Vector<Vector2> { 
    @Override 
    public Vector2 scl (float x, float y) { 
     this.x *= x; 
     this.y *= y; 
     return this; 
    } 

    @Override 
    public Vector2 add (Vector2 v) { 
     x += v.x; 
     y += v.y; 
     return this; 
    } 
} 
1

你不能做沒有鑄造(這或多或少意味着仿製藥是沒用這裏)。

-運算符只能應用於數字類型,但在編譯時,編譯器無法知道泛型類型T的運行時類型。


作爲一種變通方法,我可以建議使用BigDecimal類型和它的嵌套算術方法(如.subtract()

private void subtractValueFromColumns(BigDecimal[][] matrix, 
     ArrayList<Integer> columnsIndex, BigDecimal value) { 
    for(int i = 0; i < matrix.length; i++){ 
     for(int j = 0; j < columnsIndex.size(); j++){ 
      matrix[i][j] = matrix[i][j].subtract(value); 
     } 
    } 
} 

這有一個缺點的效果,雖然。爲了正確使用的方法,你將被迫您的數值變量轉換爲BigDecimal反之亦然

0

-只有少數類型的定義如下int和那些可轉換/拆箱像Integer。減法不能用於泛型類型,因爲Java無法知道類型T是否可以轉換爲例如int。 Java也沒有運算符重載,這意味着您不能爲任意類型定義該運算符的含義。

但是,您可以將T限制爲具有例如minus(T other)方法的東西,並使用該方法代替。您也可以使用Number而不是T,並使用.doubleValue()來進行數學計算。

另一種可能性是讓這個方法的客戶定義操作是如何工作的,像這樣:

interface Operation<T> { 
    T apply(T one, T two); 
} 

private <T> void subtractValueFromColumns(T[][] matrix, 
     ArrayList<Integer> columnsIndex, T value, Operation<T> op) { 

    for(int i = 0; i < matrix.length; i++){ 
     for(int j = 0; j < columnsIndex.size(); j++){ 
      matrix[i][j] = op.apply(matrix[i][j], value); 
     } 
    } 
}