У меня есть метод, который возвращает a map
определенный как:
public Map<String, ?> getData();
Фактическая реализация этого метода не является четкой мне, но, когда я пытаюсь сделать:
obj.getData().put("key","value")
Я получаю следующее сообщение ошибки времени компиляции:
Метод помещается (Строка, capture#9-of?) в типе Карта не применима для аргументов (Строка, Строка)
В чем проблема? String
не типа что-нибудь?
Заранее спасибо.
Подстановочный знак означает, что "параметр типа значения может быть любым" - это не означает «вы можете использовать это, как если бы это было все, что вы хотите». Другими словами, Map
действителен как Map
- но вы бы не хотели иметь возможность помещать в него строковое значение .
Если вам нужна карта, которая определенно может принимать строковые значения, вам нужно:
Map<String, ? super String>
Тип возвращаемого значения
Map<String, ?>
такой же, как
Map<String, ? extends Object>
. Это означает, что возвращаемый конкретный тип может быть Map
. Вы не можете поместить String
в AnyClass
, отсюда и ошибка.
Хороший общий принцип - не использовать подстановочные знаки в типах, возвращаемых методом.
Попробуйте следующее:
public Map<String, Object> getData();
[РЕДАКТИРОВАТЬ] Это действительно неправильно ... Я понял.
Мой первый ответ был:
Это java: Строка не является объектом.
Попробуйте использовать
obj.getData (). Put ("ключ", новая строка ("значение"));
Но String расширяет Object ... в то время как я считал String примитивом. Я кое-что узнал ^^
Map
- это краткая форма Map
и не означает, что что-либо может быть добавлено в качестве значения. В нем говорится, что объект Map может иметь любой общий тип значения, расширяющий Object
.
Это означает, что объект Map может быть HashMap
или ] HashMap
также. Поскольку компилятор не может проверить, какие типы значений будут приняты, он не позволит вам вызывать методы с типом значения в качестве параметра.
Примечание:
Map
будет иметь противоположный эффект: вы всегда можете использовать String в качестве параметра, но возвращаемый тип неясен.