使用泛型添加数字和字符串的函数

时间:2019-07-18 20:27:37

标签: java generics lambda

在一次采访中,我被要求使用Generics编写一个函数,该函数将传递给它的数字和字符串相加。该数字可以是Integer,Double等。

如果将2个字符串传递给该函数,则应在字符串后附加。最后,应返回添加的结果。

我使用Lambda如下所述。

public class WorkAround {
    public static void main(String[] args) {
        MyAdd myAdd = new MyAdd();
        System.out.println("Adding Integers: " + myAdd.add(1, 2, (a,b) -> a+ b));
        System.out.println("Adding Double: " + myAdd.add(1.2, 1.2, (a,b) -> a+ b));
        System.out.println("Adding String: " + myAdd.add("James ", "Bond", (a,b) -> a + b));
    }
}

class MyAdd {
    public <T> T add(T a, T b, BinaryOperator<T> operation) {
        return operation.apply(a, b);
    }
}

输出:

Adding Integers: 3
Adding Double: 2.4
Adding String: James Bond

但是随后,我被要求仅使用泛型就可以达到相同的结果。类似于下面的代码片段。

public class Trial {
    public static void main(String[] args) {
        MyAdd myAdd = new MyAdd();
        System.out.println("Adding Integers: " + myAdd.add(1, 2));
        System.out.println("Adding Double: " + myAdd.add(1.2, 1.2));
        System.out.println("Adding String: " + myAdd.add("James ", "Bond"));
    }
}

class MyAdd {
    public <T> T add(T a, T b) {
        return a + b;
    }
}

显然,由于以下原因,此方法不起作用。

  

对于参数类型T,T,运算符+未定义

我发现this使壁橱穿线了我的问题。但是那个问题没有处理字符串。还有其他可能会丢失的方式吗?

1 个答案:

答案 0 :(得分:0)

我们有2种情况,字符串或数字。应该进行区分。 以下解决了这个问题。

import java.math.BigDecimal;

public class Trial {
    public static void main(String[] args) {
        MyAdd myAdd = new MyAdd();
        System.out.println("Adding Integers: " + myAdd.add(1, 2));
        System.out.println("Adding Double: " + myAdd.add(1.2, 1.2));
        System.out.println("Adding String: " + myAdd.add("James ", "Bond"));
    }
}

class MyAdd {
    public String add(String a, String b) {
        return a + b;
    }

    public <T extends Number> T add(T a, T b){
        return (T) new BigDecimal(a.toString()).add(new BigDecimal(b.toString()));
    }
}