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

Java 如何编写添加数字的通用方法,java,generics,Java,Generics,我想定义一个方法来求 不同类型编号: <T> void add (T one, T two) { T res = one + two; } void add(t1,t2) { T res=1+2; } 上述方法不起作用,因为类型擦除将T转换为对象 因此,+运算符没有在对象上定义 你怎么能这么做 谢谢。模板 template <class A> A add (A a, A b) { return (a+b); } int main() { i

我想定义一个方法来求 不同类型编号:

<T> void add (T one, T two)
{
    T res = one + two; 
}
void add(t1,t2)
{
T res=1+2;
}
上述方法不起作用,因为类型擦除将
T
转换为
对象
因此,+运算符没有在
对象上定义

你怎么能这么做

谢谢。

模板
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;
}
A添加(A、A、b) { 返回(a+b); } int main() { int x=10,y=20; cout我能想到的“最简单”的解决方案是(请原谅铸造和自动装箱/拆箱):

@SuppressWarnings(“未选中”)
T加(T一,T二){
if(one.getClass()==Integer.class){
//具有自动装箱/拆箱功能
返回(T)(整数)((整数)1+(整数)2);
}
if(one.getClass()=Long.class){
//没有自动装箱/拆箱
返回(T)Long.valueOf((Long)one.longValue()+
((Long)two.longValue());
}
// ...
}

添加您想要支持的任意多个类型。或者,您也可以处理
null

看看下面的讨论:


这与您的问题大致相同。无论如何,您都不应该为此使用泛型,原因很简单:因为对于泛型,您不能添加浮点和双精度,通常您应该可以这样做!

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

public <T extends Number> double add (T one, T two)
{
    return one.doubleValue() + two.doubleValue(); 
}
public双加(t1,t2)
{
返回1.doubleValue()+2.doubleValue();
}


请注意,它使用double作为返回类型,因为它是覆盖最大值范围的基本数字类型,并且一个或两个参数也可以是
double
。请注意
Number
也有
bigdecimic
biginger
作为子类,它们可以表示
d范围之外的值ouble
。如果您想正确处理这些情况,它会使方法变得更加复杂(您必须开始处理不同的类型)根据java C++的C++语言,这个标签是在Java中,而不是在C++中,而不是在C++中。对于BLUBOWWORD来说,它非常抱歉。它显示了C++是如何比java更强大的泛型。我希望Java中没有类型擦除:-用泛型,你可以知道结果类型,但是…你可以,但是我觉得它需要o许多样板代码使其高效工作。这取决于您如何使用它。对于
java.lang.Number
,样板代码将在方法之外。对于泛型,它在方法内部……是的,您是对的。无论如何,它只编写一次,应该一直工作,除非出现新类型的数字=)我想当出现新类型的数字时,我们都会遇到麻烦:)你可能是指return(T)Integer.valueOf(((Integer)one.intValue()+((Integer)two.intValue())是的,没有自动装箱/取消装箱的情况下也是如此。谢谢您的输入。现在更完整了为什么要强制转换?为什么不按照Michael Borgwardt的建议使用有界的wild?是的,但我不想手动创建if/else语句,因为重载是一种多态性,所以编译器应该自动理解该做什么.如果这是原海报想要的,那么他的愿望就是糟糕的编程实践(tm)因为它要求方法做的太多了。Java不是鸭子类型的语言。嗯……那么
BigDecimal
biginger
呢?@Lukas:很好的观点;但是正确处理它们会使方法变得非常复杂。实际上,这相当于
公共双加(第一,第二)
。泛型无效here@newacct:你是对的;我一开始让它返回T,但后来没有办法产生一个T作为结果。
Long
覆盖了最大的值范围,而
Double
覆盖了最大的域。
Double
覆盖的范围是非单调的(也称为不连续的),这意味着您使用指数来获得大于
Long
允许的值,但不是任意两个
Double
值之间的所有中间值。例如,使用
Double
可以达到+/-无穷大,但几乎没有一个值介于2^65和2^66之间(作为随机选择)。在使用此代码段之前,您应该仔细考虑。
public <T extends Number> double add (T one, T two)
{
    return one.doubleValue() + two.doubleValue(); 
}