我有一个接收器类,它将消息放入消息队列中,如下所示
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
?
答案 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
}
}
的答案
答案 1 :(得分:1)
Java不知道add(T msg)
的实际参数类型,因为它取决于T
。
r
定义为Receiver<? extends MessageBase>
,因此它属于未知类型(虽然基于MessageBase
)。
因此Java无法匹配,因为它们可能是不同的(不匹配)类型。例如,msg可能有MessageBase1
类型,而r
可能有MessageBase2
类型,显然是不兼容的。