如何编写用于添加数字的泛型方法
我想定义一个方法,在不同类型的数字之间求和:
<T> void add (T one, T two)
{
T res = one + two;
}
上述方法不起作用,因为类型擦除转换为,因此+运算符未在...T
Object
Object
怎么可能呢?
谢谢。
我想定义一个方法,在不同类型的数字之间求和:
<T> void add (T one, T two)
{
T res = one + two;
}
上述方法不起作用,因为类型擦除转换为,因此+运算符未在...T
Object
Object
怎么可能呢?
谢谢。
您必须使用有界类型参数:
public <T extends Number> double add (T one, T two)
{
return one.doubleValue() + two.doubleValue();
}
请注意,它使用 double 作为返回类型,因为这是覆盖最大值范围的基元数值类型 - 并且一个或两个参数也可以是。请注意,也具有 和 作为子类,它们可以表示 范围之外的值。如果你想正确地处理这些情况,这将使方法更加复杂(你必须开始以不同的方式处理不同的类型)。double
Number
BigDecimal
BigInteger
double
我能想到的“最简单”的解决方案是这样的(请原谅选角和自动装箱/拆箱):
@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