我有Map一些(消息)处理程序的代码.我正在尝试使处理程序变得一致(如界面处理程序所示).如果没有泛型,处理程序都需要从Object转换到相应的类,这将是很好的避免(但一切正常).对于每个消息类(Foo下面),我有一个处理程序类.
如何将任何类型的Map映射到任何类型的处理程序并使用"just"进行/调用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 {}
}
Run Code Online (Sandbox Code Playgroud)
此代码生成:
Logic.java:16:在Logic.Handler中执行(捕获#x of?)无法应用> to(java.lang.Object)handler.execute(msg);
如何在保持Handler接口通用的同时修复它?
您无法在字段中定义键和值之间的关系,但只要使用这些方法访问地图,您就可以使用访问器方法来强制执行它.
private final Map<Class, Handler> handlers = new HashMap<Class, Handler>();
public <T> void addHandler(Class<T> clazz, Handler<T> handler) {
handlers.put(clazz, handler);
}
@SuppressWarnings("unchecked")
public <T> Handler<T> getHandler(Class<T> clazz) {
return (Handler<T>) handlers.get(clazz);
}
@SuppressWarnings("unchecked")
public <T> Handler<T> getHandlerFor(T t) {
return getHandler((Class<T>) t.getClass());
}
public void run() {
addHandler(Foo.class, new FooHandler());
}
public <T> void handleMessage(T msg) {
Handler<T> handler = getHandlerFor(msg);
if (handler != null) {
handler.execute(msg);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8622 次 |
| 最近记录: |