2013-01-15 54 views
0

我在JAVA obersver模式中執行更新時遇到問題。 我發送一個來自我的隊列系統的ArrayList到我的Observer/s。現在的問題是在Observer中,我將ArrayList作爲Object接收。下一步是將數據轉換爲ArrayList,但是由於Java的運行時間,我沒有任何參數信息,這會導致不安全的轉換。我的意思是我可以通知我的觀察員一個整體的類,但我不知道我是否錯了,或者是「用巨石拍攝小鳥」。結果是沒有錯誤的最終原因,我總是通知一個典型的觀察者,但問題是我應該採取警告還是有解決方法。從Observable發出通知後不安全的參數化ArrayList

  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; 

} 

不過感謝您的幫助

回答

0

JLS §5.1.9約選中鑄件,當/爲什麼他們發生的會談更新。長話短說:

  • 你不檢查arg實際上是一個ArrayList(即arg instanceof ArrayList<?>)。
  • 無法檢查arg是否包含Message對象的ArrayList(至少在ArrayList的每個元素上都沒有使用instanceof)。換句話說,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 
} 

這將讓僅從argMessage對象,如果它是一個ArrayList,否則這將是空的。