Java泛型继承神秘错误

时间:2013-01-07 14:44:17

标签: java generics inheritance

我有一个接收器类,它将消息放入消息队列中,如下所示

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

2 个答案:

答案 0 :(得分:2)

当您使用带有lowerbound(?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
        }
    }

请参阅Why it isn't allowed

的答案

答案 1 :(得分:1)

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

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

因此Java无法匹配,因为它们可能是不同的(不匹配)类型。例如,msg可能有MessageBase1类型,而r可能有MessageBase2类型,显然是不兼容的。