如何编写用于添加数字的泛型方法

2022-09-04 07:26:03

我想定义一个方法,在不同类型的数字之间求和:

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

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

怎么可能呢?

谢谢。


答案 1

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

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

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


答案 2

我能想到的“最简单”的解决方案是这样的(请原谅选角和自动装箱/拆箱):

@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


推荐