我有一个监听消息对象的监听器类。检查消息对象的实例类型,并在确定实例类型后采取适当的操作。以下是示例代码
public void onMessage(IMessage message){
if(message instanceof MoPn) {
doThis();
} else if(message instanceof MoAn) {
doThat();
} else if(message instanceof MoBn) {
doSomethingElse();
}
}
我知道这不是最好的方法,但由于遗留原因,我无法改变它。现在要点是我想让消息处理异步。我想做的就是检查消息是否属于我感兴趣的类别。如果是,请将其放入队列进行异步处理。以下是示例类。
public class SampleClass
{
List<Class<? extends IMessage>> messageClasses = new ArrayList<Class<? extends IMessage>>();
SampleClass() {
messageClasses.add(moAn.class);
messageClasses.add(moBn.class);
messageClasses.add(moPn.class);
}
public void onMessage(IMessage message) {
for(IMessage messageClass : messageClasses) {
if(message instanceof messageClass) {
putItInTheQueue(message);
}
}
}
}
当我像上面那样编码时,我无法正确地投射我的消息类。有人可以帮助我为下面的语句编写语法正确的代码吗?
if(message instanceof messageClass )
答案 0 :(得分:3)
instanceof
仅适用于编译时已知的类。请查看Class的文档。你可以这样做:
public void onMessage(IMessage message) {
for(Class<? extends IMessage> messageClass : messageClasses) {
if(messageClass.isAssignableFrom(message.getClass())) {
putItInTheQueue(message);
}
}
}
答案 1 :(得分:1)
parentClazz.isAssignableFrom(clazz)
答案 2 :(得分:1)
正如其他答案所提到的,您可以使用messageClass.isAssignableFrom(message.getClass())
。
你也可以使用isInstance method,这几乎与instanceof
运算符完全等效(交换参数)。即。
for(Class<? extends IMessage> messageClass : messageClasses) {
if(messageClass.isInstance(message)) {
putItInTheQueue(message);
}
}