我有以下静态工厂实现:
public class HandlersFactory {
private static Map<ProviderType, Handler<? extends Request>> handlers;
public static Handler<? extends Request> get(ProviderType type) {
if (handlers == null) {
initializeHandlers();
}
if (handlers.containsKey(type)) {
return handlers.get(type);
}
throw new HandlerNotFoundException("Handler " + type.toString() + " not found");
}
private static void initializeHandlers() {
handlers = new HashMap<>();
handlers.put(ProviderType.FIRST, new FirstHandler());
handlers.put(ProviderType.SECOND, new SecondHandler());
}
FirstHandler和SecondHandler都实现了以下接口:
public interface Handler<R extends Request> {
void handle(R request);
}
Request对象是包含请求的附加数据的两个附加类的基类。
在我的主要课程中,我试图做以下事情:
public void handle(Request request) {
HandlersFactory.get(request.getProvider()).handle(request);
}
请求的来源是HTTP请求体,它可以解析为任何一个请求子类。我得到的编译错误是:;所需类型:捕获?扩展请求,提供请求";。
我知道Request对象不会自我扩展,这听起来很奇怪,但有没有办法我仍然可以用这种方式调用handle方法?
虽然不是很优雅,但以下修改应该有效:
public static <T extends Request> Handler<T> get(ProviderType type) {
和
return (Handler<T>) handlers.get(type);