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

时间:2013-01-25 16:10:39

标签: java object polymorphism

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

注意:我不想要类似C ++函数模板的东西,因为两个操作数只是Object s,即我想实现一个函数add

Object add(Object a, Object b){
    // ?
}

然后能够做这样的事情:

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

2 个答案:

答案 0 :(得分:3)

我也需要类似的东西,所以我把一些希望返回与内置加法运算符返回相同类型的东西打成一片(除了上传到Object)。我使用java spec来确定类型转换的规则,特别是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();
}

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

答案 1 :(得分:2)

如果您只关心参数是“对象”类型但可以指定类型INSIDE 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);
}