2012-12-17 40 views
4

我正在嘗試創建一些Java類,它應該可以使用float或double數字(爲了模擬目的,我需要同時支持這兩種數字)。這些類需要做一些基本的算術運算,還需要使用三角函數(sin,cos,atan2)。Java通用算術

我試圖做一個通用的方法。由於Java不允許泛型中的原始類型,並且確實允許Double和Float,但是使基本的算術不可能,所以我圍繞Double和Float構建了一個包裝類。但是,只要我需要在其中一個泛型類中實例化一個值,這種方法就會失敗。

是否有任何干淨的方式來支持浮動和雙重,而不重複每種類型的所有代碼?

+0

如果你編寫double的方法,你也可以將它用於float。 – Thihara

+0

你需要使用包裝類還是基元? –

+0

@Thihara是的,但該方法將返回一個double,與其參數的類型無關。我需要保持一定的精度。 – crater2150

回答

5

根據經驗,如果您在Java中進行硬核數值工作,最好堅持原始類型。這意味着泛型對於這種類型的工作來說是不可行的(當然,對於許多其他用途來說,這也是完美的)。

是否有任何干淨的方式來支持float和double,而不重複每種類型的所有代碼?

你可以實現的較高精度的一個方面較低精度的方法:

public static double calc(double x, double y) { 
    // do the calculation and return double 
} 

public static float calc(float x, float y) { 
    return (float)calc((double)x, (double)y); 
} 
+0

謝謝,我決定使用類似的東西。不像我所希望的那樣通用,但它看起來並不像泛型和算術一樣可以在Java中一起工作 – crater2150

4

也許這是你在找什麼呢?

class MyClass<T extends Number> { 
    T add(T t1, T t2) { 
     if (t1 instanceof Double) { 
      return (T) Double.valueOf((t1.doubleValue() + t2.doubleValue())); 
     } else if (t1 instanceof Float) { 
      return (T) Float.valueOf(((t1.floatValue() + t2.floatValue()))); 
     } else if (t1 instanceof Integer) { 
      return (T) Integer.valueOf(((t1.intValue() + t2.intValue()))); 
     } 
     // you can add all types or throw an exception 
     throw new IllegalArgumentException(); 
    } 

    public static void main(String[] args) { 
     MyClass<Double> mc = new MyClass<Double>(); 
     mc.add(1.0, 1.1); 
    } 
}