将数据放入Map<String, ?>中

9

我有一个 Map,其中包含一些值被传递到一个方法中:

public String doThis(Map<String, ?> context){
.....
}

我正在尝试向此Map插入一个额外的属性

String abc="123";
context.put("newAttr",abc);

但我遇到了以下错误:

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

有没有办法在不“克隆”Map的情况下执行此put操作?


你是否正在尝试创建一个可以存储任何类型对象的Map? - Perception
3个回答

11
如果你想把类型为X的值放入泛型Map中,你需要将Map声明为Map<String, ? super X>。在你的例子中,X是String,因此:
public String doThis(Map<String, ? super String> context){
.....
}

Map<String, ? super X>的意思是:一个键类型为String,值类型为X或X的超类的映射。所有这样的映射都能够接受String实例作为键和X实例作为值。


1
+1,但是你最后一段有一个错别字:你应该用super而不是extends。 :-) - ruakh

4
记住 PECS(生产者 Extends,消费者 Super)。你有一个消费者(输入),因此它不能是 extends

0

令人惊讶的是,我们可以将这个映射转换为更易于使用的形式。只需使用这个简单的语法:(Map<String,ObjectOrSth>)unfriendlyMap

// Let's get this weird map.
HashMap<String, String> mapOrig = new HashMap<String, String>();
Map<String, ?> mapQuestion = (Map<String, ?>)mapOrig;
//mapQuestion.put("key2", "?"); // impossible

// Convert it to almost anything...
Map<String, String> mapStr2 = (Map<String, String>)mapQuestion;
mapStr2.put("key2", "string2");
assertThat(mapOrig.get("key2")).isEqualTo("string2");
Map<String, Object> mapObj = (Map<String, Object>)mapQuestion;
mapObj.put("key3", "object");
assertThat(mapOrig.get("key3")).isEqualTo("object");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接