如何通过通用接口的方法:
interface Adder<T> {
T add(T first, T second);
}
而一个管理器类:
public class AdderManager{
public <T> AdderManager putAdder(final Class<T> clazz,
final Adder<? extends T> adder){
adders.put(clazz, adder);
return this;
}
@SuppressWarnings("unchecked")
public <T> Adder<T> getAdder(final Class<T> clazz){
return (Adder<T>) adders.get(clazz);
}
private final Map<Class<?>, Adder<?>> adders =
new HashMap<Class<?>, Adder<?>>();
}
现在,您可以注册和使用自定义的加法器不同类别:
final AdderManager manager = new AdderManager();
manager
.putAdder(String.class, new Adder<String>(){
@Override
public String add(final String first, final String second){
return first.concat(second);
}
})
.putAdder(Integer.class, new Adder<Integer>(){
@Override
public Integer add(final Integer first, final Integer second){
return first + second;
}
})
.putAdder(List.class, new Adder<List<?>>(){
@Override
public List<?> add(final List<?> first, final List<?> second){
final List<Object> newList = new ArrayList<Object>();
return newList;
}
});
现在你可以使用像这样的加法器:
String addedString = manager.getAdder(String.class).add("abc", "def");
@SuppressWarnings("unchecked") // this is necessary because of
// the generic <Integer> type
List<Integer> addedList = manager
.getAdder(List.class)
.add(
Arrays.asList(1,2,3),
Arrays.asList(4,5,6)
);
当您执行Integer i + Integer j时,实际上并没有添加Integers。 “整数”不支持“+”运算符。他们将unboxed放入`ints`,而不是直接添加为`Integer`对象。您不能添加通用对象,因为对象不支持`+`运算符。 “字符串”是一种特殊情况,支持`+`。 – 2011-01-24 13:30:41
你会调用你的两个例子`add`的唯一原因是因为它们使用`+`运算符,这实际上是一种无意义的相似性,因为它对Strings和Integers完全不同。名称方法基于它们从调用者的角度实际做了什么 - 在这种情况下`sum`和`concatenate`将是好名字。 – 2011-01-24 13:35:16