2012-01-11 20 views
5

所以我认为有它的一些值的地图被传递给方法:投入一个地图<String, ?>

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

而且我想插入除了属性这个地图

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

但我收到此错误:

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

反正是有执行该认沽没有“克隆”的地图?

+0

您是否试图创建一个可以存储任何类型对象的地图? – Perception 2012-01-11 20:21:14

回答

11

如果要将类型X的值放入通用Map中,则需要声明MapMap<String, ? super X>。在您的例子,X为String,所以:

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

Map<String, ? super X>是指:与一类是X或超X类型的所有这些地图是准备接受StringString类型的密钥和值的地图实例作为键和X实例作为值。

+1

+1,但你的最后一段有一个错字:你的意思是'super'而不是'extends'。 :-) – ruakh 2012-01-11 20:19:23

+0

@ruakh的确。谢谢。 – 2012-01-11 20:22:18

+0

不错。谢谢。 – ovaherenow 2012-01-11 20:31:23

4

记住佩奇(生产者延伸消费者超)。你有一个消费(在推杆),因此它不能extends

0

令人惊讶的,我们可以转换这个地图到一个更容易使用的形式。就在这个simiple语法:(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"); 
相关问题