:
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")
List<Integer> addedList = manager
.getAdder(List.class)
.add(
Arrays.asList(1,2,3),
Arrays.asList(4,5,6)
);