這個問題被問了很多次,但我找不到優雅的解決方法。 這個例子可以作爲期望:方法的泛型重載 - 解決方法
public class RequestWrapper<T> {
private final T request;
private final Class<T> type;
public RequestWrapper(T request, Class<T> type) {
this.request = request;
this.type = type;
}
public T getRequest() {
return request;
}
public Class<T> getType() {
return type;
}
}
public class Service {
private void invoke(String request) {
System.out.println("String:" + request);
}
private void invoke(Object request) {
System.out.println("Object:" + request + "," + request.getClass().getSimpleName());
}
public static void main(String[] args) {
RequestWrapper<String> sw = new RequestWrapper<String>("A", String.class);
RequestWrapper<Integer> iw = new RequestWrapper<Integer>(Integer.valueOf(0), Integer.class);
new Service().invoke(sw.getRequest());
new Service().invoke(iw.getRequest());
}
}
但我需要添加一個方法來服務類這之前做一些事情/ Invoke方法的調用之後:
public void invoke(RequestWrapper<?> wrapper) {
try {
// ...
invoke(wrapper.getType().cast(wrapper.getRequest()));
invoke(wrapper.getRequest());
} catch(Exception e) {
// ...
}
}
則主要方法將包含:
new Service().invoke(sw);
我明白使用invoke(Object request)而不是invoke(String request)的原因。 什麼是一個優雅的解決方案來調用正確的調用方法,並能夠在它之前/之後執行一些常見操作?
要有一個接口,例如Invoker,實現它StringInvoker,Invoker>和調用map.get(wrapper.getType())。invoke(wrapper.getRequest())是可能的解決方案,但我期望更好的東西。
沒錯,但是這正是我想要擺脫。如何利用方法重載的不同想法? – Samot 2014-10-02 13:02:26