放入Map <string,?=“”> </string,>

时间:2012-01-11 20:13:42

标签: java generics map

所以我有一个Map,它有一些值传递给方法:

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

我试图在此地图中添加一个附加属性

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

但是我收到了这个错误:

  

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

无论如何,如果没有&#34;克隆&#34;地图?

3 个答案:

答案 0 :(得分: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 :(得分:4)

记住PECS(Producer Extends,Consumer Super)。您有一个消费者(放入),因此它不能是extends

答案 2 :(得分: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");