【问题标题】:Java generic arithmeticJava 泛型算术
【发布时间】:2012-12-17 17:32:26
【问题描述】:

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

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

有没有什么简洁的方法可以同时支持浮点和双精度,而无需为每种类型复制所有代码?

【问题讨论】:

  • 如果你把方法写成double,你也可以用float..
  • 您需要使用包装类还是使用原语?
  • @Thihara 是的,但是该方法随后将返回一个双精度数,而与其参数的类型无关。我需要保持给定的精度。
  • @AndrewLogvinov:我不需要使用 Number 包装类,但如果可以在解决方案中使用某种包装类,那么对于使用集合会很有帮助。我主要需要做算术。仅使用原语,我必须为每种类型编写一次所有方法,如果可能的话,我想避免这种情况。
  • 如果您使用 Number,那么您必须进行检查以确保其实际 Doubles 和 Floats 已通过...

标签: java generics primitive


【解决方案1】:

也许这就是您要找的东西?

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);
    }
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 谢谢,我决定使用类似的东西。没有我希望的那么通用,但看起来泛型和算术在 Java 中没有办法很好地协同工作
    猜你喜欢
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 2012-01-24
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多