Проблема с использованием общей карты с шаблоном
У меня есть метод, который возвращает 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 является примитивным. Я кое-что узнал ^^