2011-11-15 98 views
0

我有一個運算符類,它有一些處理數學運算的類和方法。運算符類別是通用的,並且延伸數,所以我的操作可以與整數,雙精度浮點數,等等在Java中約束泛型類

public class OperatorClass<T extends Number> 

在該類別有,它提供了號碼時使用計算操作的方法的抽象類方法

abstract class Op<T extends Number> { 
    abstract T calculate(DataSet<? extends Number> ds); 
} 

有一些像AddOp擴展運算,例如多個類:

class AddOp<T extends Number> extends Op<T>{ 
    public T calculate(DataSet<? extends Number> ds) { 
     return ds.getLeft() + ds.getRight(); 
    } 
} 

而且我的數據集僅僅是一個數據類,看起來像這樣:

public class DataSet<T extends Number> { 
private T left; 
private T right; 

public DataSet(T left, T right) { 
    this.left = left; 
    this.right = right; 
} 

public T getLeft() { 
    return left; 
} 
public T getRight() { 
    return right; 
} 

}

我遇到的問題是,線ds.getLeft() + ds.getRight()不編譯因爲數字抽象類不能做+運營商。我如何讓我的DataSet成爲一種數字類型(如通配符類),所以我可以對它進行數學運算。

任何幫助,將不勝感激 感謝

編輯

因此,一個解決方法的問題是,我使用了一些if語句,然後得到像這樣

Number result = null; 
if(ds.getLeft().getClass().equals(Integer.class)) 
    result = new Integer(ds.getLeft().intValue() + ds.getRight().intValue()); 
.... 
return (T) result; 

回答

1
正確的原始數據類型

你必須決定你要添加的分辨率。換句話說,你打電話給left.getInteger()還是left.getFloat()

有很多方法可以解決這個問題,但它真的歸結爲你打算做的事情。如果您希望自己的號碼真正保留對象,則不能使用+ plus運算符,因爲這不適用於對象。你需要一個left.plus(right)風格的方法調用,它返回一個新的號碼。

如果你不關心維護您的數字作爲在數學練習對象(也許他們只是對象收集儲存或東西的緣故),然後你用public long getLeft()更換public T getLeft(),依靠內線號碼的left.getLongValue()做轉換。或者,您只需公開兩個Number對象,並允許「外部」用戶執行相應的getXxxValue()調用。

+0

我不知道是否有可能,但我試圖讓它可以有一個OperatorClass 並且所有的操作都是整數,稍後我可以創建一個OperatorClass 對象,現在所有的操作都會上雙打。 –

+0

這是可能的,但如果你想讓你的數字成爲對象,你需要實現算術運算的方法。像'+','''''''等等數學運算符只在內置類型上運行,它們不能在'Objects'上運行,只有'+'用來連接'Strings' 。 –

+0

我只是用一些if語句來檢查數字是int,double,float等,然後從數字中得到int值,double值等,並進行了算術運算 –

0

數字類型是基本類型,您不能對它們進行一般的算術運算。 Java的泛型不能像C++模板那樣工作,也不會生成類型特定的代碼,並且無法添加兩個Number實例或任何其他基本包裝類型的實例。

什麼你想要做的是在Java中不可能的,你必須編寫不同的方法intdoubles等(或任何你想支持。)

0

不能超載Java中的運算符。所以,最簡單的是改變:

return ds.getLeft() + ds.getRight(); 

到(像)

return ds.getLeft().getDouble() + ds.getRight().getDouble(); 

我說,因爲你可能要處理了一下類型轉換。

認爲還有其他方法getFloat() getInt()...我選擇了雙倍,因爲截斷不會有任何損失。