5

floatまたはdoubleの数値で動作するJavaクラスを作成しようとしています(シミュレーションの目的で、両方をサポートする必要があります)。クラスはいくつかの基本的な算術を実行する必要があり、三角関数(sin、cos、atan2)も使用する必要があります。

私は一般的なアプローチを試みました。Javaはジェネリックスのプリミティブ型を許可せず、MyClass<T extends Number>実際にDoubleとFloatを許可しますが、基本的な演算を不可能にするため、DoubleとFloatの周りにラッパークラスを構築します。しかし、ジェネリッククラスの1つで値をインスタンス化する必要があるとすぐに、このアプローチは失敗します。

各タイプのすべてのコードを複製せずに、floatとdoubleの両方をサポートするクリーンな方法はありますか?

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でハードコアな数値作業を行っている場合は、プリミティブ型に固執することをお勧めします。これは、ジェネリックスがこのタイプの作業には使用できないことを意味します(ただし、もちろん、他の多くの用途には完全に問題ありません)。

各タイプのすべてのコードを複製せずに、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);
}
于 2012-12-17T09:16:24.410 に答える