public class Converter {
private static interface Conv<From,To> {
public To convert(From from);
}
private static class FromTo {
Class<?> fromClass;
Class<?> toClass;
public FromTo(Class<?> fromClass, Class<?> toClass) {
this.fromClass = fromClass;
this.toClass = toClass;
}
@Override
public boolean equals(Object o) {
if (o instanceof FromTo) {
FromTo ft = (FromTo) o;
return fromClass.equals(ft.fromClass) && toClass.equals(ft.toClass);
}
else return false;
}
@Override
public int hashCode() { return fromClass.hashCode() + 17*toClass.hashCode(); }
}
private static Map<FromTo,Conv<?,?>> map = new HashMap<FromTo,Conv<?,?>>();
static {
map.put(new FromTo(Long.class, Date.class), new Conv<Long, Date>(){
public Date convert(Long from) {
return new Date(from);
}});
map.put(new FromTo(String.class, Integer.class), new Conv<String, Integer>(){
public Integer convert(String from) {
return Integer.parseInt(from);
}});
}
public static <From, To> To convert(From from, Class<To> clazz) {
Conv<From, To> conv = (Conv) map.get(new FromTo(from.getClass(), clazz));
if(conv == null) {
throw new UnsupportedOperationException("Conversion from " +
from.getClass().getName() + " to " + clazz.getName() + " is not supported.");
}
return conv.convert(from);
}
public static void main(String... args) {
Date date = convert(Long.valueOf(100000), Date.class);
System.out.println(date);
Integer integer = convert("42", Integer.class);
System.out.println(integer);
//System.out.println(convert("42", Date.class)); //throws UOE
}
}