【发布时间】:2013-01-07 14:44:17
【问题描述】:
我有一个接收器类,它将消息放入消息队列中,如下所示
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 子类的消息是否应该不起作用?
【问题讨论】:
-
查看我的回答here。最好记住的方法是缩写词 PECS,生产者
extends,消费者super。生产者为您提供数据(例如通过get方法),因此生产者使用extends。您想要的是一个获取数据的消费者(例如通过add方法)。有关更多信息,请参阅我在该链接上的解释。
标签: java generics inheritance