从Observable通知后转换为不安全的参数化ArrayList

时间:2013-01-15 20:25:08

标签: java generics observer-pattern

我在JAVA中的obersver模式中执行更新时遇到问题。 我将来自我的排队系统的ArrayList发送到我的Observer / s。现在的问题是在Observer中我将ArrayList作为Object接收。下一步将是一个转换为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;

}

尽管感谢帮助

1 个答案:

答案 0 :(得分:0)

JLS §5.1.9讨论未经检查的演员表以及他们何时/为何发生。长话短说:

  • 您不会检查arg实际上是ArrayList(即arg instanceof ArrayList<?>)。
  • 没有办法检查argArrayList是否包含Message个对象(至少在instanceof上没有使用ArrayList arg instanceof ArrayList<Message> 1}})。换句话说,@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

只有来自arg ArrayList的{​​{1}}对象,如果它是{{1}},否则它将为空。