我想这样做(最小重现):
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/