Не понимаю generic wildcard bounderies Ussage.
Не могли бы вы объяснить, почему processList
работает довольно хорошо, а processMap
с ошибкой компиляции в следующем примере? Как я должен изменить подпись processMap
, чтобы заставить его работать с обоими Map<String, List<String>>
и Map<String, List<Object>>
Общие подстановочные знаки в сложных типах
public void processList(List<? extends Object> list) {
}
public void processMap(Map<String, List<? extends Object>> map) {
}
public void f() {
List<String> list = new ArrayList<>();
Map<String, List<String>> map = new HashMap<>();
processList(list); // OK
processMap(map); // ERROR
}
Двигаясь общее определение типа от типа аргумента метода к методу paramether сделал трюк
public void processMap(Map<String, List<? extends Object>> map)
public <T extends Object> void processMap(Map<String, List<T>> map)
Я бы теперь хотелось узнать разницу между ними. Перемещено на another thread.
Я не знаю, прав я или нет, но, похоже, java-компилятор не может разрешить или преобразовать тип коллекции, используемый в качестве ключа к коллекции карт, определенной в проблеме. Я говорю об этом, потому что когда я изменяю подпись функции как «public static void processMap (Map Extends Object, List > map)', он отлично работает. Похоже, что существует большая разница между ' и' extends Object> 'при использовании в таких объявлениях. Его многоуровневая концепция подстановочных знаков. –
qwerty