在一次采访中,我被要求使用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使壁橱穿线了我的问题。但是那个问题没有处理字符串。还有其他可能会丢失的方式吗?
答案 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()));
}
}