0

JAVAのobersverパターンの更新の実装に問題があります。キューイングシステムからのArrayListをオブザーバーに送信します。問題は、ArrayListをオブジェクトとして受け取るオブザーバーにあります。次のステップはArrayListへのキャストですが、Javaの実行時間のためにパラメーター情報がないため、安全でないキャストになります。つまり、ジェネリッククラス全体でオブザーバーに通知することはできますが、私が間違っているのか、それとも「小鳥の岩で撃っている」のかはわかりません。結果として、最終的な原因にエラーはありません。私は常にこのオブザーバーに1つのtypで通知しますが、問題は警告を受け取るべきか、それとも回避策があるかということです。

            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<?>
  • がオブジェクトを含むかどうかを確認する方法はありargません(少なくとも、の各要素を使用せずに)。つまり、コンパイルされません。ArrayListMessageinstanceofArrayListarg 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 に答える