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

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

public Map<String, ?> getData();

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

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

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

Метод помещается (Строка, capture#9-of?) в типе Карта не применима для аргументов (Строка, Строка)

В чем проблема? String не типа что-нибудь?

Заранее спасибо.

11
задан forsvarir 25 May 2011 в 09:51
поделиться

5 ответов

Подстановочный знак означает, что "параметр типа значения может быть любым" - это не означает «вы можете использовать это, как если бы это было все, что вы хотите». Другими словами, Map действителен как Map - но вы бы не хотели иметь возможность помещать в него строковое значение .

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

Map<String, ? super String>
10
ответ дан 3 December 2019 в 03:52
поделиться

Тип возвращаемого значения

Map<String, ?>

такой же, как

Map<String, ? extends Object>

. Это означает, что возвращаемый конкретный тип может быть Map . Вы не можете поместить String в AnyClass , отсюда и ошибка.

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

15
ответ дан 3 December 2019 в 03:52
поделиться

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

public Map<String, Object> getData();
0
ответ дан 3 December 2019 в 03:52
поделиться

[РЕДАКТИРОВАТЬ] Это действительно неправильно ... Я понял.

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

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

Попробуйте использовать

 obj.getData (). Put ("ключ", новая строка ("значение"));

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

-2
ответ дан 3 December 2019 в 03:52
поделиться

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

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

Примечание:

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

Похожие вопросы: