使用instanceof运算符

时间:2014-10-19 18:15:23

标签: java instanceof

我有一个监听消息对象的监听器类。检查消息对象的实例类型,并在确定实例类型后采取适当的操作。以下是示例代码

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  )

3 个答案:

答案 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);
    }
}