java泛型实例变量有界集合

标签 java generics

我有下面的 Java 泛型示例,其中我尝试存储一个 processors 映射,该映射可以存储其对象的 Processor 。我为 Processor 类添加了一个泛型类型。我想限制映射processors仅存储它的关键类的Processor对象作为它的值。有没有办法在 processors 集合上使用 java 通配符或类型绑定(bind)?请注意,映射本身可以在键中存储不同类的多个对象。

public class GenericsExample {

    private Map<?, Processor<?>> processors = new HashMap<>();

    public <O> void parameterisedMethod(O o) {
        processors.put(o, new Processor<O>());
    }

    static class Processor<T> {
        void process(T t) {
            System.out.println(t + " processed.");
        }
    }

    public static void main(String[] args) {
    }
}

最佳答案

正如 @LouisWasserman 在他的评论中指出的,你无法匹配 java 中 Map 的键和值类型。

要实现此目的,您应该在映射声明中使用 Object 而不是通配符作为键类型:

private Map<Object, Processor<?>> processors = new HashMap<>();

编译器现在将允许您在映射中插入具有任何关联处理器的任何键。您的工作是只允许插入匹配的类型:

<T> void addProcessor(T instance, Processor<? super T> processor) {
    processors.put(instance, processor);
}

为了在读取 map 时创建类型安全的错觉,您将需要显式强制转换;也许还有一些 @SuppressWarning("unchecked") 注释。例如:

@SuppressWarnings("unchecked")
<T> Processor<T> getProcessor(T instance) {
    return (Processor<T>) processors.get(instance);
}

关于java泛型实例变量有界集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47787500/

相关文章:

c# - 无法将 lambda 表达式转换为委托(delegate)类型 'System.Func<T,TKey>'

java - 如何确保 java 中的集合只包含一种类型?

java - 当堆栈跟踪仅显示 Eclipse 中的 native 方法时,如何找到导致错误的代码行

java - 使用休息服务获取方法不适用于 Jersey 客户端

java - Hibernate 的多个配置文件

c# - 泛型变量限制和接口(interface)

c# - 如何将泛型类序列化为 XML?

java - 为什么不能用 Java 实现泛型数组?

java - 错误找不到函数名称的符号

java - 静态方法内存分配