이 질문은 여러 번 묻는 질문 있지만 우아한 해결 방법을 찾을 수 없습니다.메서드의 제네릭 오버로드 - 해결 방법
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 (String request) 대신 invoke (Object request)가 사용 된 이유를 알고 있습니다. 적절한 호출 메소드를 호출하고 그 전후에 몇 가지 공통적 인 조치를 취할 수있는 우아한 해결책은 무엇입니까?
예 : 호출자, 구현자, 예 : StringInvoker, Invoker> 그리고 call map.get (wrapper.getType()). invoke (wrapper.getRequest())는 가능한 해결책이지만, 나는 더 나은 것을 기대한다.
Class<?> c = wrapper.getType();
if (c == String.class)
invoke((String) wrapper.getRequest()); // Invokes invoke(String)
else if (c == Integer.class)
invoke((Integer) wrapper.getRequest()); // Invokes invoke(Integer)
else
invoke(wrapper.getRequest()); // Invokes invoke(Object)
참고 :
당신이가는 경우
당신은 캐스팅을 명시 적으로 유형을 확인 할 수 있습니다
그래,하지만 내가 없애 싶어 정확히입니다. 메소드 오버로딩의 이점을 취하는 다른 아이디어? – Samot