我用一种方法创建了数学运算的接口,计算,获取了不同数量的参数
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。
是否有可能实现这一目标?
答案 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
方法。要返回相同的类型值,想法是使用 Function
或 Supplier
或 Factory
创建类型 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);
}
}