在java中,我有两个Object
支持加法(+)的s,例如两个int
s或两个String
s。我如何编写一个函数来真正添加它们而不指定类型?
注意:我不想要 C++ 函数模板之类的东西,因为两个操作数只是Object
s,即我想实现一个函数add
:
Object add(Object a, Object b){
// ?
}
然后能够做这样的事情:
Object a = 1, b = 2;
Object c = add(a, b);
在java中,我有两个Object
支持加法(+)的s,例如两个int
s或两个String
s。我如何编写一个函数来真正添加它们而不指定类型?
注意:我不想要 C++ 函数模板之类的东西,因为两个操作数只是Object
s,即我想实现一个函数add
:
Object add(Object a, Object b){
// ?
}
然后能够做这样的事情:
Object a = 1, b = 2;
Object c = add(a, b);
我也需要类似的东西,所以我拼凑了一些东西,希望返回与内置加法运算符返回的类型相同的类型(除了向上转换为对象)。我使用java 规范来找出类型转换的规则,特别是第 5.6.2 节 Binary Numeric Promotion。我还没有测试过这个:
public Object add(Object op1, Object op2){
if( op1 instanceof String || op2 instanceof String){
return String.valueOf(op1) + String.valueOf(op2);
}
if( !(op1 instanceof Number) || !(op2 instanceof Number) ){
throw new Exception(“invalid operands for mathematical operator [+]”);
}
if(op1 instanceof Double || op2 instanceof Double){
return ((Number)op1).doubleValue() + ((Number)op2).doubleValue();
}
if(op1 instanceof Float || op2 instanceof Float){
return ((Number)op1).floatValue() + ((Number)op2).floatValue();
}
if(op1 instanceof Long || op2 instanceof Long){
return ((Number)op1).longValue() + ((Number)op2).longValue();
}
return ((Number)op1).intValue() + ((Number)op2).intValue();
}
理论上,您可以使用数值引用类型、数值原始类型甚至字符串来调用此方法。
如果您只关心参数是“Object”类型,但可以在 add() 方法中指定类型,则可以使用“instanceof”
private Object add(Object a, Object b) {
// check if both are numbers
if (a instanceof Number && b instanceof Number) {
return ((Number) a).doubleValue() + ((Number) b).doubleValue();
}
// treat as a string ... no other java types support "+" anyway
return a.toString() + b.toString();
}
public void testAdd()
{
Object a = 1;
Object b = 3;
Object strC = "4";
Object numResult = add(a, b);
Object strResult = add(strC, a);
}