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

当您将泛型与下界(?扩展类型语法)一起使用时,您无法将任何内容添加到您的容器中。

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

Java 不知道 的实际参数类型,add(T msg)因为它依赖于T.

r被定义为Receiver<? extends MessageBase>,因此它属于未知类型(尽管基于MessageBase)。

所以 Java 不能同时匹配两者,因为它们可能属于不同的(不匹配的)类型。例如 msg 可能有一个MessageBase1类型并且r可能有一个MessageBase2类型,它们(显然)是不兼容的。

于 2013-01-07T14:59:06.330 回答