1

我想这样做(最少的复制):

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

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

但有人告诉我:

Map 类型中的 put(capture#25-of ?, capture#26-of ?) 方法不适用于参数 (String, Object)

似乎 String 和 Object 在这里都应该没问题。我的问题有两个部分:(1)为什么?(2)我怎样才能做这样的事情?

4

3 回答 3

1

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

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!
于 2012-07-16T21:05:20.107 回答
1

Map<?, ?> 真正的意思是,Map<? 扩展对象,?extends Object> 根据 Java 类型系统,您只能获取使用 ? 专门化的类型参数的值。从方法调用扩展通配符。你不能将它传递给方法。

PS 可能你想要 Map<Object, Object>

于 2012-07-16T21:15:44.740 回答
0

这篇博文提供了答案。简而言之,编译器不知道是否Map<?, ?>真的是 aMap<String, Object>或者说 a Map<Integer, Double>,所以它不能保证你的类型安全。

于 2012-07-16T21:10:15.767 回答