Java通用算法

Java通用算法,java,generics,primitive,Java,Generics,Primitive,我正在尝试创建一些Java类,这些类可以使用浮点数或双倍数(出于模拟目的,我需要同时支持这两种类型)。这些类需要做一些基本的算术运算,还需要使用三角函数(sin、cos、atan2) 我尝试了一种通用的方法。由于Java不允许在泛型中使用基元类型,MyClass确实允许Double和Float,但使基本算法变得不可能,因此我围绕Double和Float构建了一个包装类。但是这种方法失败了,只要我需要在一个泛型类中实例化一个值 有没有干净的方法可以同时支持float和double,而不复制每种类型

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

我尝试了一种通用的方法。由于Java不允许在泛型中使用基元类型,
MyClass
确实允许Double和Float,但使基本算法变得不可能,因此我围绕Double和Float构建了一个包装类。但是这种方法失败了,只要我需要在一个泛型类中实例化一个值


有没有干净的方法可以同时支持float和double,而不复制每种类型的所有代码?

根据经验,如果您在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);
}

也许这就是你要找的

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);
    }
}
class-MyClass{
T加(t1,t2){
if(t1双精度实例){
返回(T)Double.valueOf((t1.doubleValue()+t2.doubleValue());
}else if(t1实例浮点数){
返回(T)Float.valueOf(((t1.floatValue()+t2.floatValue()));
}else if(t1 instanceof Integer){
返回(T)Integer.valueOf(((t1.intValue()+t2.intValue()));
}
//您可以添加所有类型或引发异常
抛出新的IllegalArgumentException();
}
公共静态void main(字符串[]args){
MyClass mc=新的MyClass();
mc.add(1.0,1.1);
}
}

如果您为double编写方法,您也可以将其用于float。。您需要使用包装类还是原语?@Thihara是的,但该方法将返回double,与参数类型无关。我需要保持给定的精度。@AndrewLogvinov:我不需要使用数字包装类,但对于使用集合来说,如果在解决方案中可以使用某种包装类,这将非常有用。我主要需要做算术。如果只使用原语,我将不得不为每种类型编写一次所有方法,如果可能的话,我希望避免这种情况。如果您使用Number,那么您将必须进行检查,以确保其实际值加倍并通过浮动…谢谢,我决定使用类似的方法。不像我希望的那样通用,但在Java中似乎没有办法让泛型和算术很好地协同工作