Java泛型继承神秘错误

标签 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 子类的消息?

最佳答案

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

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

关于Java泛型继承神秘错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14198159/

相关文章:

java - IntelliJ 未检测到同一 Hybris 模块中的 java 类

swift - 如何在运行时确定泛型变量的值?

c++ - 如果存在具有不同参数的继承成员,为什么对 C++ 结构的函数的调用会模棱两可?

javascript - JS 通过绑定(bind)传递参数到对象内部函数以访问对象范围内的特定变量的最佳实践

java - Spring @Cacheable 除非由自定义 key 生成器创建的属性引用 key

java - 在 JAX-RS 中的查询参数中转义 `%` 符号

java - 如何在jsp页面中打印java字符串数组?

Java 将类型作为参数传递给需要子类型的函数

c# - 我可以在 XAML(.NET 4 Framework 之前)中指定泛型类型吗?

ios - Swift:UIViewController常用函数继承