我有下面的 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/