0

Javaでは、Object加算(+)がサポートされている2つのがあります。たとえば、2つintまたは2つStringです。タイプを指定せずに実際にそれらを追加する関数を作成するにはどうすればよいですか?

注: 2つのオペランドは単なるsであるため、C ++関数テンプレートのようなものは必要ありませんObject。つまり、関数を実装したいのですadd

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

そして、次のようなことができるようになります。

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

2 に答える 2

3

私も似たようなものが必要なので、組み込みの加算演算子が返すのと同じ型を返すものを一緒に叩きました(オブジェクトにアップキャストされた場合を除く)私はJava仕様を使用して、型変換の規則、特定のセクション5.6.2 BinaryNumericPromotionを理解しました。私はまだこれをテストしていません:

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

そして理論的には、このメソッドを数値参照型、数値プリミティブ型、さらには文字列で呼び出すことができます。

于 2013-12-30T17:20:11.333 に答える
2

パラメータが「オブジェクト」タイプであることに気を配っているが、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);
}
于 2013-01-25T16:31:48.777 に答える