我想定义一种方法来进行总和 不同类型的数字:
<T> void add (T one, T two)
{
T res = one + two;
}
上述方法不起作用,因为类型擦除会将T
转换为Object
因此+ {运算符未在Object
...
怎么做?
感谢。
答案 0 :(得分:14)
您必须使用有界类型参数:
public <T extends Number> double add (T one, T two)
{
return one.doubleValue() + two.doubleValue();
}
请注意,它使用double作为返回类型,因为它是覆盖最大值范围的原始数字类型 - 并且一个或两个参数也可以是double
。请注意,Number
也有BigDecimal
和BigInteger
作为子类,可以表示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;
}