1

次のようにメッセージをメッセージキューに入れるレシーバークラスがあります

public class Receiver<T extends MessageBase> {

  private LinkedBlockingQueue<T> messageQueue = new LinkedBlockingQueue<T>();

  public void add(T msg) {
    messageQueue.add(msg);
  }

  public void Class<T> getType() {
    ...
  }
}

このようにメッセージを追加しようとすると

public <T extends MessageBase> void processMessage(T msg) {
    for (Receiver<? extends MessageBase> r : receivers) {
        if (msg.getClass().equals(r.getType())) {
            r.add(msg);
        }
    }
}

私は

The method add(capture#3-of ? extends MessageBase) in the type 
Receiver<capture#3-of ? extends MessageBase> is not applicable 
for the arguments (T)

Receiverクラスは拡張するようにキャストされているので、 ?MessageBaseのサブクラスであるメッセージを追加することはできません。MessageBase

4

2 に答える 2

2

ジェネリックを下限(?extends Type構文)で使用する場合、コンテナーに何も追加できません。

for (Receiver<? extends MessageBase> r : receivers) {
        if (msg.getClass().equals(r.getType())) {
            r.add(msg);// This is wrong, as you cannot add anything into Receiver
        }
    }

許可されない理由については、この回答を参照してください

于 2013-01-07T14:49:21.330 に答える
1

add(T msg)Javaは、に依存するため、の実際のパラメータタイプを認識しませんT

rはとして定義されているReceiver<? extends MessageBase>ため、タイプは不明です(に基づいていますがMessageBase)。

したがって、Javaは、異なる(一致しない)タイプである可能性があるため、両方を一致させることはできません。たとえば、msgにはMessageBase1タイプrがあり、MessageBase2タイプには(明らかに)互換性がない可能性があります。

于 2013-01-07T14:59:06.330 に答える