我想通过一个共同的信息处理器Java泛型的设计问题
//
// Library code
//
abstract class Processor<M extends MessageHandler<? extends Message>> {
HashMap<Class<Message>, M> handlerMap;
void addHandler(M, Class<Message>);
void run() {
while(true) {
...
}
}
// QUESTION - how to define this to include the fact that H extends M<T>
// actually im just trying to avoid the ugly cast in the client code.
abstract <H extends MessageHandler<T>, T extends Message> void dispatch(H handler, T message);
}
class MessageHandler<T extends Message> {
}
class Message {
}
//
// Client code
//
class ServerMessage extends Message {
...
}
class ServerMessageHandler<T extends Message> extends MessageHandler<T> {
...
void process(T msg, Object... params) {
...
}
}
class ServerProcessor extends Processor<ServerMessageHandler<? extends Message>> {
@Override
<H extends MessageHandler<T>, T extends Message> void dispatch(H handler, T message) {
// QUESTION - how do i get rid of this cast?
((ServerMessageHandler<T>)handler).process(T, ...);
}
}
服务器处理器将处理许多不同的服务器消息分派消息特有的处理程序,都用自己的亚型,成员等每一个这些消息将有一个单独的处理程序。一些基类消息类将共享处理程序。
我的问题是我如何避免在客户端代码丑陋的投射?我似乎不能编写dispatch方法的签名来包含事实,我们知道消息处理程序将是M类型(ServerMessageHandler),并且特定的ServerMessageHandler由T参数化,并且类型T的消息将在争论名单。
编辑
我不介意,如果addHandler操作方法不能得到总的类型安全,我可以做一些运行时检查,以确保适当的关系被强制执行(我将不得不改变其签名做正确虽然)。我的主要目标是以某种方式强制(通过签名)调度方法中的两种关系。被调用的处理程序是M类型的,并且被T参数化以实际调用此方法,run方法中将会有一些未经检查的强制转换(它依次调用dispatch)。但我不介意在那里有丑陋。只是试图将其移出ServerProcessor。
我可以写 摘要 void dispatch(M handler,T message) 但这需要在代码 –
aepurniet
2009-09-30 09:52:45