【发布时间】:2014-06-06 02:39:19
【问题描述】:
我的代码有一个Map 的(消息)处理程序。我正在尝试使处理程序通用化(如接口处理程序所见)。如果没有泛型,处理程序都需要从 Object 转换为相应的类,这很好避免(但一切正常)。对于每个消息类(下面的Foo),我都有一个处理程序类。
如何将任何类型的类映射到任何类型的处理程序并使用“仅”Object 获取/调用? (不能限制handleMessage(Object)的参数)
请参阅下面的 MWE。
import java.util.*;
public class Logic
{
Map<Class<?>, Handler<?>> handlers = new HashMap<Class<?>, Handler<?>>();
public void run()
{
handlers.put(Foo.class, new FooHandler());
}
public void handleMessage(Object msg)
{
Handler<?> handler = handlers.get(msg.getClass());
if (handler != null) {
handler.execute(msg);
}
}
private interface Handler<T>
{
public void execute(T msg);
}
private class FooHandler implements Handler<Foo>
{
public void execute(Foo msg) {}
}
private class Foo {}
}
这段代码产生:
Logic.java:16:无法将 Logic.Handler 中的执行(capture#x of ?)应用于(java.lang.Object) handler.execute(msg);
如何在保持 Handler 接口通用的同时修复它以使其正常工作?
【问题讨论】: