Java 类型捕获集合中的通配符

标签 java generics collections types

我想这样做(最小重现):

String key = "foo";
Object value = new Bar();

if (target instanceof Map<?,?>) {
    Map<?,?> map = (Map<?,?>)target;
    map.put(key, value);
    ...

但有人告诉我:

The method put(capture#25-of ?, capture#26-of ?) in the type Map is not applicable for the arguments (String, Object)

看起来 String 和 Object 在这里都应该没问题。我的问题有两个部分:(1)为什么? (2)我怎样才能让这样的事情发挥作用?

最佳答案

问题是使用无界通配符的集合不允许向其中添加元素。如果他们这样做了,您可以将集合转换为具有更具体的类型参数,突然之间,泛型应该提供的类型安全性消失了:

Map<?,?> map = (Map<?,?>)target;
map.put(key, value);  // Not actually allowed
Map<String, String> evilMap = (Map<String, String>)map;
String barAsString = evilMap.get(key); // But it's actually a Bar!

关于Java 类型捕获集合中的通配符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11512511/

相关文章:

java - Glassfish 4 与 EMF Texo - JPA 无持久性提供程序

java - Java API 日期错误

java - 将 JButton actionListener 传递给另一个 Java 类时出现空指针异常

c# - IEnumerable 和延迟加载

java - Apache CXF : jax-rs Client - GET Array of Objects

java - 无法在 Rational application Developer 8 中启动 websphere server 8

c# - 一般执法

java - 使用枚举值的成员类型声明泛型类时遇到问题

ios - 查找传递给函数的泛型类型

java - 迭代优先级队列抛出 ConcurrentModificationException