Помещение в карту <String,?> - PullRequest
8 голосов
/ 12 января 2012

Итак, у меня есть карта, в которой есть некоторые значения, которые передаются в метод:

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

И я пытаюсь вставить атрибут дополнения в эту карту

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

Но я получаю эту ошибку:

Метод put (String, capture # 8-of?) В типе Map не применим для аргументов (String, String)

Есть ли способ выполнить этот путь без «клонирования» карты?

Ответы [ 3 ]

11 голосов
/ 12 января 2012

Если вы хотите поместить значения типа 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 экземпляры значения.

4 голосов
/ 12 января 2012

Помните PECS (продюсер продлевает, потребительский супер). У вас есть потребитель (ввод), поэтому он не может быть extends.

0 голосов
/ 02 июля 2017

Удивительно, но мы можем преобразовать эту карту в более простую форму.Просто с этим простым синтаксисом: (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");
...