Processor.dispatch可以采用任何扩展MessageHandler的类型。
在ServerProcessor的方法是不完整的替代Processor.dispatch - 它会为它不与类转换异常ServerMessageHandler实例句柄失败(我假设ServerMessageHandler不延长MessageHandler是一个错字,而不是由设计,否则就会失败对于所有输入,因为没有MessageHandler是ServerMessageHandler;否则只需输入参数类型ServerMessageHandler)。
为什么你会期望以类型安全的方式表达本质上不安全的行为?
对于Processor.dispatch的契约是H可以是任何MessageHandler和T可以是任何信息。如果H只能是处理程序的类型Processor由M参数化,那么在定义中使用它:
abstract class Processor> {
...
abstract void dispatch (M handler, T message);
}但是,这又失去了一些东西,因为M与T无关。在Java中没有任何东西等同于unbind/bind习惯用法,并且看起来分派方法似乎不应该关心消息的子类型,或处理器应该关心 - 你似乎你addHandler方法来维持消息处理程序类型的混合服用的处理程序在运行时的任何方法,然后想使之具体在分配方法的特定类型。
那么处理器只处理一种消息类型吗?如果是,并且您希望类型安全,则将消息类型设置为类型参数。如果它处理在运行时决定的多种消息类型,那么您将无法获得类型的编译时检查。
如果将事件处理循环和机制分离到处理程序,则可以移动强制转换:
/**
* @param message type
*/
class Processor < M > {
Dispatcher dispatcher;
public Processor ( Dispatcher dispatcher ) {
this.dispatcher = dispatcher;
}
void run ( M...messages ) {
for ( M message : messages ) {
// as there is no mechanism in java to get from Class to Foo, this call
// must be made with the wildcard H Foo>
dispatcher.dispatch ( message );
}
}
}
interface Dispatcher {
void dispatch ( T message );
}
class Message {
}
class ServerMessage extends Message {
//...
}
interface ServerMessageHandler {
//...
void process ( T msg, String param ) ;
}
class ServerDispatcher implements Dispatcher {
HashMap < Class < ? extends ServerMessage >, ServerMessageHandler> > handlerMap = new
HashMap < Class < ? extends ServerMessage >, ServerMessageHandler> > ();
void addHandler ( ServerMessageHandler handler, Class < T > clz ) {
handlerMap.put ( clz, handler );
}
@SuppressWarnings("unchecked")
// cannot use a trick like clz.cast() as we want ServerMessageHandler rather than T
ServerMessageHandler getHandler ( Class < ? extends ServerMessage > clz ) {
return ( ServerMessageHandler ) handlerMap.get(clz);
}
@Override
public
void dispatch ( T message ) {
ServerMessageHandler serverMessageHandler = getHandler ( message.getClass() );
serverMessageHandler.process ( message, "wibble" );
}
}但是,如果环路自基本事件类型的队列中Process.run()代码驱动的,这将是没有更好的类型安全性方面,作为ServerDispatcher.dispatch称为唯一的版本与T = ServerMessage,和演员隐藏在getHandler()方法中。安全来自addHandler和getHandler的对称性,而不是从类型变量T不同的绑定。分离Processor和Dispatcher意味着只有特定Dispatcher有了解T和ServerMessageHandler之间的关系。