2

我用一种方法制作了一个数学运算接口,计算,采用各种数量的参数

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...)

我想要实现的是一个简单的类,例如两个 Doubles 并返回 Double 。

有没有可能实现这一目标?

4

3 回答 3

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 (....) 
    }
}
于 2013-02-18T23:17:53.940 回答
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。但是,它不再需要了。

于 2013-02-18T23:28:53.830 回答
0

对于加法,我们可以使用类doubleValue()的方法Number。要返回相同的类型值,想法是使用 a FunctionorSupplier或 aFactory创建类型 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);
    
    }
}
于 2021-01-17T07:53:38.653 回答