Подтвердить что ты не робот

Метод в типе Map <String, capture # 1-of? extends Object> не применимо

У меня есть следующий JAVA метод, реализованный благодаря интерфейсу:

public String importDocument(ImportSource source, Map<String, ? extends Object> paramMap);

Когда я пытаюсь сделать следующее, я получаю предупреждение компиляции. Отрывок:

paramMap.put("Key", "Value");

Ошибка:

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

Почему?

4b9b3361

Ответ 1

? extends Object

Вы используете общий шаблон. Вы не можете выполнять операцию добавления, поскольку тип класса не определен. Вы не можете добавить/поставить что-нибудь (кроме null).

Для получения дополнительной информации об использовании подстановочного знака вы можете обратиться к oracle docs.

Collection<?> c = new ArrayList<String>();
c.add(new Object()); // Compile time error

Так как мы не знаем, что означает тип элемента c, мы не можем добавлять к нему объекты. Метод add() принимает аргументы type E, типа элемента коллекции. Когда фактическим параметром типа ?, это означает некоторое unknown type. Любой параметр, который мы передаем для добавления, должен быть подтипом этого неизвестного типа. Поскольку мы не знаем, что это такое, мы ничего не можем передать. The sole exception is null, which is a member of every type.

Ответ 2

Вы можете попробовать добавить элемент, который вы добавляете к родовому типу, перед добавлением.

Для этого прототипа:

public <T extends RandomClass> void randomMethod(Collection<T> randomCollection);

Я делаю это перед добавлением:

randomCollection.add((T) addedItem);