如何对类型泛型函数执行数学运算?
例如,如果我有一个Function
接口,它接受两个类型参数,用于定义生成其功能的内部方法。一个参数用于返回类型,另一个参数用于函数的参数类型。
实施例。 :
Function<Integer, Integer> f = new specificFunction();
specificFunction()
实现如何执行依赖于不同类型的任何数学运算?即Integer
,float
等。
答案 0 :(得分:1)
实际上,你不能。泛型是仅对象的。您无法对对象执行数学运算。看起来你可以,因为你可以这样做:
Integer a = 1;
Integer b = 2;
Integer c = a + b;
但这仅仅是因为自动装箱。实际发生的是编译器用以下代码替换该代码:
Integer a = new Integer(1);
Integer b = new Integer(3);
Integer c = Integer.valueOf(a.intValue() + b.intValue());
必须知道这种类型。你能做的最好就是这样:
interface Function<N extends Number> {
N calculate(N n1, N n2);
}
您现在可以执行以下操作:
class AddInteger
implements Function<Integer> {
@Override
public Integer calculate(Integer n1, Integer n2) {
/* actually does
* return Integer.valueOf(n1.intValue() + n2.intValue()); */
return n1 + n2;
}
}
您可能会发现这是可能的:
class AddAlmostAny<N extends Number>
implements Function<N> {
@Override
public N calculate(N n1, N n2) {
if(n1.getClass() != n2.getClass())
throw new IllegalArgumentException("unmatched types");
if(n1 instanceof Integer)
return (N)new Integer(n1.intValue() + n2.intValue());
if(n1 instanceof Double)
return (N)new Double(n1.doubleValue() + n2.doubleValue());
if(n1 instanceof BigInteger)
return (N)((BigInteger)n1).add((BigInteger)n2));
// etc
throw new IllegalArgumentException("unknown type");
}
}
但这基本上违背了仿制药的目的。
答案 1 :(得分:-1)
使用未绑定的通配符然后将其强制转换。
在这里查看更多信息 http://docs.oracle.com/javase/tutorial/java/generics/restrictions.html