2013-08-23 27 views
0

我已經定義了一個像這樣的Point類。如何從通用數據中減去值

class Point<E,F> {E x; E y; ...} 

,這樣我可以給浮動,整... [反正它的許多]

但是,當我想操縱它的錯誤。

void getdistance(Point<Number, Number> pt) { 
    this.x-pt.x.floatValue(); //not a statement 
    this.y-pt.y.floatValue(); 
} 

也我不應該給字符串作爲類型,所以我應該將其更改爲數字? 或任何其他方式來計算距泛型的距離?

但是,如果我改變類型爲數如何指定不同的座標類型[浮點數或整數]?

如何推斷這裏的類型?

this.y-pt.y.TypeValue? 

我們該怎麼辦,如果它的整數或雙?

當我通過

pt.getdistance(otherpt); 

編譯器顯示錯誤:創建一個方法getDistance的(浮點型,整數)。如何將其他方法傳遞給該方法?

回答

1

你可以告訴他們應該帶擴展號碼的類型:

<T extends Number, T1 extends Number> 

這樣,你就可以通過它浮法等

3

嘗試和定義點是這樣的:Point<E extends Number, F extends Number>。 這樣編譯器就可以知道EF都是數字。

但是,你甚至可能要簡化,要Point<N extends Number>因爲最有可能的兩個座標應該是相同類型的(即DoubleInteger等) - 混合類型似乎很奇怪我。

的方法將不得不進行調整:

<X extends Number, Y extends Number> float getdistance(Point<X, Y> pt) { 
    float dx = this.x.floatValue() - pt.x.floatValue(); 
    float dy = this.y.floatValue() - pt.y.floatValue(); 

    return (whatever your distance calculation needs to look like); 
} 

注意,X和Y可能爲空,因此你必須檢查這一點。 指定XY這裏允許您將Point<Float, Integer>傳遞給Point<Double, Long>的成員方法。您可以在這裏重新定義EF,但這可能會造成混淆。

編輯

我會闡述馬克彼得斯的評論了一下:

使用floatValue()甚至doubleValue()可能導致的精度損失,因爲即使double將無法​​準確地代表每個long的值。因此,您可能會遇到嚴重的精確度損失,尤其是在數量更高的情況下

此外,BigIntegerBigDecimal是數字也和那些具有更高的準確度。

爲了獲得最大的精確度,你不得不使用在計算BigDecimal和創建初始值時,你必須檢查類型值,並調用相應的方法:

  • 對於ByteShortIntegerLong你會打電話BigDecimal.valueof(x.longValue())
  • FloatDouble你會打電話BigDecimal.valueof(x.doubleValue())
  • BigDecimal可作爲是
  • BigInteger將被傳遞到BigDecimal構造

這將增加相當多的複雜性,並在這種情況下,你可能要與子類Point的arshajii的建議,而不是去。

+0

兩個座標聲明的類型'E'(我不知道在哪裏'F'進來)。 – arshajii

+0

好,因爲他的示例方法的參數是'點<數字,數字>',我想'E'和'F'意味着x和y的類型。 – Thomas

+0

我希望它是不同的,也許<浮動,整數> – Dineshkumar