0

我在 JAVA 中执行 obersver 模式的更新时遇到问题。我将来自队列系统的 ArrayList 发送到我的 Observer/s。现在的问题出在观察者中,我将 ArrayList 作为对象接收。下一步将转换为 ArrayList,但由于 Java 的运行时,我没有参数信息,这会导致不安全的转换。我的意思是我可以用一个完整的通用类通知我的观察者,但我不知道我是不是弄错了,或者它是“用巨石射击小鸟”。结果最终没有错误,因为我总是用一个类型通知这个观察者,但问题是我应该接受警告还是有解决方法。

            ArrayList<Message> messageList = sqsUtil.getMessagefromAnotherEntrypoint("myQueueName");
        if (messageList != null) {
            // notify Observers
            notifyObservers(messageList);

        }

然后是发生不安全演员表的更新

    @Override
public void update(Observable o, Object arg) {
    ArrayList<Message> aMessageList = (ArrayList<Message>)arg;

}

不过感谢帮助

4

1 回答 1

0

JLS §5.1.9讨论了未经检查的强制转换以及它们发生的时间/原因。长话短说:

  • 你不检查这arg实际上是一个ArrayList(即arg instanceof ArrayList<?>)。
  • 没有可能的方法来检查是否argArrayList包含Message对象的(至少在不使用instanceof中的每个元素的情况下是这样ArrayList)。换句话说,arg instanceof ArrayList<Message>不编译。

如果您想摆脱警告(即您知道它不会抛出异常,或者您希望它抛出异常),那么您可以使用@SuppressWarnings("unchecked")

@Override
public void update(Observable o, Object arg) {
    @SuppressWarnings("unchecked")
    ArrayList<Message> aMessageList = (ArrayList<Message>) arg;
}

如果您只需要获取消息并且不希望出现异常:

@Override
public void update(Observable o, Object arg) {
    ArrayList<Message> messages = new ArrayList<Message>();
    if (arg instanceof ArrayList<?>)
        for (Object o : (ArrayList<?>) arg)
            if (o instanceof Message)
                messages.add((Message) o);

    // Do stuff with the messages list
}

如果它是一个,这将只获取Message对象,否则它将是空的。argArrayList

于 2013-01-15T20:45:16.090 回答