通用类型扩展数,计算

时间:2013-02-18 23:06:30

标签: java generics math

我用一种方法创建了数学运算的接口,计算,获取了不同数量的参数

public interface MathOperation {
    public <T extends Number> T calculate(T... args);
}

这个类的实现也很简单,但不起作用:

private class Sum implements MathOperation {
    @Override
    public <T extends Number> T calculate(T... args) {
        return args[0] + args[1];
    }
}

问题是:

bad operand types for binary operator '+'
  first type:  T
  second type: T
  where T is a type-variable:
    T extends Number declared in method <T>calculate(T...)

我想要实现的是一个简单的课程,例如两个双打并返回Double。

是否有可能实现这一目标?

3 个答案:

答案 0 :(得分:4)

+无法应用于extend Number的类型。 new Integer(5) + new Integer(5)因自动装箱而起作用。您将不得不查看args的运行时类型并相应地执行操作。

有些内容:

private class Sum implements MathOperation {
    @Override
    public <T extends Number> T calculate(Class<T> clazz, T... args) {
         if (clazz.equals(Integer.class))
         {
             return Integer.class.cast(args[0]) + Integer.class.cast(args[1]);
         } else (....) 
    }
}

答案 1 :(得分:0)

您可以测试运行时类型,如其他答案所示。或者您可以尝试不同的设计:创建一个作为工厂的抽象类:

interface MathContext<T extends Number> {

    ...

    T valueOf(double d);
    T valueOf(int i);
    T add (T... args);
}

您要使用的类型的具体类:

DoubleContext implements MathContext<Double> {

    ...

    Double valueOf(int i) {
        return i;
    }

    Double valueOf(double d) {
        return d;
    }

    Double add(Double... args) {
        Double res = 0;
        for (Double arg: args)  {
            res += arg;
        }
        return res;
    }

}

现在您可以使用该类实现MathOperation。但是,它不再需要了。

答案 2 :(得分:0)

对于加法,我们可以使用 doubleValue() 类的 Number 方法。要返回相同的类型值,想法是使用 FunctionSupplierFactory 创建类型 T 的实例。

class MathOperation<T extends Number> {
  
    public double add(T a, T b) {
        double d = a.doubleValue() + b.doubleValue();
        return d;
    }

    public T add(T a, T b, Function<Double,T> function) {
        double d = a.doubleValue() + b.doubleValue();
        return function.apply(d);
    
    }
}