Проблема с использованием общей карты с шаблоном

У меня есть метод, который возвращает map, который определяется как:

public Map<String, ?> getData();

Фактическая реализация этого метода мне не понятна, но, когда я пытаюсь сделать:

obj.getData().put("key","value")

Я получаю следующее сообщение об ошибке времени компиляции:

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

В чем проблема? Является ли String типом ничего?

Спасибо заранее.

Ответ 1

Подстановочный знак означает, что "параметр типа значения может быть любым" - это не значит, что вы можете использовать его так, как если бы это было то, что вы хотите, чтобы оно было ". Другими словами, a Map<String, UUID> действителен как Map<String, ?> - но вы не захотите вставлять в него значение String.

Если вам нужна карта, которая может определенно принимать строковые значения, вы хотите:

Map<String, ? super String>

Ответ 2

Возвращаемый тип

Map<String, ?>

совпадает с

Map<String, ? extends Object>

Средство возврата конкретного типа может быть Map<String, AnyClass>. Вы не можете поместить String в AnyClass, следовательно, ошибку.

Хорошим общим принципом является не использование подстановочных знаков в типах возвращаемых методов.

Ответ 3

Map<String, ?> является короткой формой Map<String,? extends Object> и не означает, что в качестве значения можно добавить что-либо. В нем говорится, что объект Map может иметь любой общий тип значения, расширяющий Object.

Это означает, что объект Map может быть HashMap<String, String> или HashMap<String, Integer>. Поскольку компилятор не может проверить, какие типы значений будут приняты, он не позволит вам вызывать методы с типом значения в качестве параметра.

Примечание:

  • Вы можете вызывать методы с типом значения как возвращаемое значение, потому что все должно расширять Object (? extends Object)
  • A Map<String, ? super String> будет иметь противоположный эффект: вы всегда можете использовать параметр String as, но возвращаемый тип неясен.

Ответ 4

Попробуйте следующее:

public Map<String, Object> getData();

Ответ 5

[EDIT] Это действительно неправильно... Я понял.

Мой первый ответ был:

Это java: String не является объектом.

Попробуйте

obj.getData().put("key",new String("value"));

Но String расширяет Object... пока я думал, что String является примитивным. Я кое-что узнал ^^