Java 如何对两个对象调用加法运算符?

Java 如何对两个对象调用加法运算符?,java,object,polymorphism,Java,Object,Polymorphism,在java中,我有两个支持加法(+)的对象,例如两个ints或两个Strings。如何编写一个函数来真正添加它们而不指定类型 注:我不想要像C++函数模板之类的东西,因为两个操作数只是对象< /C> > s,即我想实现一个函数 Addio> Object add(Object a, Object b){ // ? } 然后可以做这样的事情: Object a = 1, b = 2; Object c = add(a, b); 如果您只关心参数是“对象”类型,但可以在add()方法中

在java中,我有两个支持加法(+)的
对象,例如两个
int
s或两个
String
s。如何编写一个函数来真正添加它们而不指定类型

<强>注:我不想要像C++函数模板之类的东西,因为两个操作数只是<代码>对象< /C> > s,即我想实现一个函数<代码> Addio>

Object add(Object a, Object b){
    // ?
}
然后可以做这样的事情:

Object a = 1, b = 2;
Object c = add(a, b);

如果您只关心参数是“对象”类型,但可以在add()方法中指定类型,则可以使用“instanceof”


如果您只关心参数是“对象”类型,但可以在add()方法中指定类型,则可以使用“instanceof”


我也需要类似的东西,所以我拼凑了一些东西,希望返回与内置加法操作符返回的类型相同的类型(除了向上转换为对象)。我使用了来找出类型转换的规则,特别是第5.6.2节二进制数字升级。我还没有对此进行测试:

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();
}

理论上,你可以用数字引用类型,数字基元类型,甚至字符串来调用这个方法。

我也需要类似的东西,所以我拼凑了一些东西,希望能返回与内置加法操作符返回的类型相同的类型(除了向上转换到对象)。我使用了来找出类型转换的规则,特别是第5.6.2节二进制数字升级。我还没有对此进行测试:

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();
}

理论上,您可以使用数字引用类型、数字基元类型甚至字符串调用此方法。

您可以为支持的类型编写
add
Object a=1,b=2不调用构造函数?您希望生成的对象是什么?将字符串添加到数字的结果是什么?@ryanm与java的行为相同,例如,
“s”+2
必须是
“s2”
,但是,
add
以多态方式将其作为
对象
返回。如果没有肮脏的自定义黑客,这是不可行的……但是为什么要这样做呢?为什么不直接跟踪对象的实际类型,并使用实际的
+
操作符呢?您可以为支持的类型编写
add
object a=1,b=2不调用构造函数?您希望生成的对象是什么?将字符串添加到数字的结果是什么?@ryanm与java的行为相同,例如,
“s”+2
必须是
“s2”
,但是,
add
以多态方式将其作为
对象
返回。如果没有肮脏的自定义黑客,这是不可行的……但是为什么要这样做呢?为什么不跟踪对象的实际类型,并使用实际的
+
操作符呢?如果a和b是
int
s,那么这个实现将返回一个
double
,而不是
int
。是的,但是从您的问题来看,这仍然有效,因为您只关心返回一个工作对象类型。java中有许多数字类型。如果需要特定于int,则可以相应地将检查/强制转换更改为type:Integer。如果a和b是
int
s,则此实现将返回一个
double
,而不是
int
。是的,但从您的问题来看,这仍然有效,因为您只关心返回工作对象类型。java中有许多数字类型。如果需要特定于int,可以相应地将检查/强制转换更改为type:Integer。