类型泛型方法的数学运算

时间:2013-12-27 00:05:23

标签: java generics

如何对类型泛型函数执行数学运算?

例如,如果我有一个Function接口,它接受两个类型参数,用于定义生成其功能的内部方法。一个参数用于返回类型,另一个参数用于函数的参数类型。

实施例。 : Function<Integer, Integer> f = new specificFunction();

specificFunction()实现如何执行依赖于不同类型的任何数学运算?即Integerfloat等。

2 个答案:

答案 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