如何编写添加数字的通用方法

时间:2011-08-12 09:13:28

标签: java generics

我想定义一种方法来进行总和 不同类型的数字:

<T> void add (T one, T two)
{
    T res = one + two; 
}

上述方法不起作用,因为类型擦除会将T转换为Object 因此+ {运算符未在Object ...

上定义

怎么做?

感谢。

4 个答案:

答案 0 :(得分:14)

您必须使用有界类型参数:

public <T extends Number> double add (T one, T two)
{
    return one.doubleValue() + two.doubleValue(); 
}

请注意,它使用double作为返回类型,因为它是覆盖最大值范围的原始数字类型 - 并且一个或两个参数也可以是double。请注意,Number也有BigDecimalBigInteger作为子类,可以表示double范围之外的值。如果你想正确处理这些情况,会使方法更加复杂(你必须开始处理不同类型的不同)。

答案 1 :(得分:13)

我能想到的“最简单”的解决方案就是这个(借助投射和自动装箱/拆箱):

@SuppressWarnings("unchecked")
<T> T add(T one, T two) {
    if (one.getClass() == Integer.class) {
        // With auto-boxing / unboxing
        return (T) (Integer) ((Integer) one + (Integer) two);
    }
    if (one.getClass() == Long.class) {
        // Without auto-boxing / unboxing
        return (T) Long.valueOf(((Long) one).longValue() + 
                                ((Long) two).longValue());
    }

    // ...
}

添加您想要支持的类型。或者,你也可以处理null ......

答案 2 :(得分:0)

看看关于SO的讨论:How to add two java.lang.Numbers?

这和你的问题差不多。无论哪种方式,你都不应该使用泛型,为什么?简单:因为使用泛型,你无法添加Float和Double,这通常你应该可以做到!

答案 3 :(得分:-2)

template <class A>
A add (A a, A b)
{
    return (a+b);

}
int main()
{
    int x =10, y =20;
    cout <<"The Integer Addition is " << add(x,y);
    return 0;
}