5

我正在尝试创建一些 Java 类,它们应该可以使用浮点数或双精度数(出于模拟目的,我需要同时支持两者)。这些类需要做一些基本的算术,还需要使用三角函数(sin、cos、atan2)。

我试图做一个通用的方法。由于 Java 不允许泛型中的原始类型并且MyClass<T extends Number>确实允许 Double 和 Float,但使基本算术成为不可能,我围绕 Double 和 Float 构建了一个包装类。但是,一旦我需要在一个泛型类中实例化一个值,这种方法就会失败。

是否有任何干净的方法来支持浮点和双精度,而无需复制每种类型的所有代码?

4

2 回答 2

6

也许这就是你要找的?

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);
    }
}
于 2012-12-17T09:32:26.417 回答
5

根据经验,如果您在 Java 中进行核心数值工作,最好坚持使用原始类型。这意味着泛型对于这种类型的工作是不可行的(但对于许多其他用途来说当然是完全可以的)。

是否有任何干净的方法来支持浮点和双精度,而无需复制每种类型的所有代码?

您可以根据高精度方法实现低精度方法:

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);
}
于 2012-12-17T09:16:24.410 回答