どのように汎用的なインタフェースを備えたアプローチについて:
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)
);
「整数i +整数j」を実行すると、実際には「整数」が追加されていません。 'Integers'は' + '演算子をサポートしていません。それらは 'ints'にunboxされ、' Integer'オブジェクトとして直接追加されることはありません。オブジェクトは '+'演算子をサポートしていないので、汎用オブジェクトを追加することはできません。 'Strings'は特殊なケースで、' + 'をサポートします。 –
あなたが両方の例を 'add'と呼ぶ唯一の理由は、' + '演算子を使うからです。これは実際には意味のない類似点です。呼び出し元の視点から実際に何をするかに基づいた名前付けメソッド - この場合は 'sum'と' concatenate'は良い名前になります。 –