Come su un approccio con un'interfaccia generica:
interface Adder<T> {
T add(T first, T second);
}
e una classe dirigente:
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<?>>();
}
Ora è possibile registrare e utilizzare vipere personalizzati per le diverse classi:
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;
}
});
E ora puoi usare quei sommatori come questo:
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)
);
fonte
2011-01-24 13:51:35
Quando si esegue 'Integer i + Integer j', in realtà non si aggiungono' Numeri interi '. 'Interi' non supportano l'operatore '+'. Ricevono unboxed in 'ints', non direttamente aggiunti come oggetti' Integer'. Non è possibile aggiungere oggetti generici perché gli oggetti non supportano l'operatore '+'. 'Stringhe 'sono un caso speciale e supportano' + '. –
L'unico motivo per cui chiamereste entrambi i vostri esempi 'add' è perché usano gli operatori' + ', che in realtà è una similarità senza significato poiché fa cose completamente diverse per Stringhe e Interi. Assegnare nomi a metodi basati su ciò che effettivamente fanno dal punto di vista del chiamante, ad esempio 'sum' e' concatenate' in questo caso sarebbero dei buoni nomi. –