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

xde*_*000 12 java generics

我想定义一个方法来在不同的类型号之间进行求和:

<T> void add (T one, T two)
{
    T res = one + two; 
}
Run Code Online (Sandbox Code Playgroud)

上面的方法不起作用,因为类型擦除转换TObject +因此+运算符没有定义Object...

怎么办?

谢谢.

Mic*_*rdt 15

您将不得不使用有界类型参数:

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

需要注意的是它采用双作为返回类型,因为这是原始的数字类型,它包含的值的最大范围内-和一个或两个参数可能是double太.需要注意的是Number还具有BigDecimalBigInteger作为子类,其可以表示的范围以外的值double.如果你想正确处理这些情况,它会使方法更加复杂(你必须开始处理不同类型的不同).

  • 实际上,这相当于`public double add(Number one,Number two)`.仿制药在这里没有效果 (3认同)
  • @Lukas:好点; 但要正确处理它们会使方法复杂化. (2认同)
  • "Long"涵盖了最大的**范围**值,而"Double"涵盖了最大的**域**.范围"Double"覆盖是非单调的(也称为不连续),意味着您使用指数来达到比"Long"允许的更大的值,但不是任何两个任意"Double"值之间的所有中间值.例如,使用"Double"可以达到+/-无穷大,但几乎没有2 ^ 65和2 ^ 66之间的值(作为随机选择).在使用此代码段之前,您应该仔细考虑. (2认同)

Luk*_*der 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());
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

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

  • 如果那是原始海报想要的东西,那么他的欲望就是*糟糕的编程实践*(tm),因为它要求方法做得太多.Java不是一种鸭子类型的语言. (2认同)