У меня есть HashMap, где значения - ArrayLists, и я пытаюсь написать функцию, которая будет принимать универсальные экземпляры этих HashMaps
HashMap<String, ArrayList<Integer>> myMap = new HashMap<String, ArrayList<Integer>>();
public static void foo(HashMap<?, ArrayList<?>> a) {}
public static void bar(HashMap<?, ? extends ArrayList<?>> a) {}
// Compilation Failure!
foo(myMap);
// This works, but why do I need ? extends ArrayList
bar(myMap)
Сообщение об ошибке
Метод foo(HashMap<?,ArrayList<?>>)
в типе Example
не применим
для аргументов (HashMap<String,ArrayList<Integer>>
).
Зачем мне нужен групповой символ для расширений ArrayList?
Я думал, что, имея ArrayList<?>
(без ? extends
), я мог бы ограничить функцию только HashMaps со значениями ArrayList.
Я также знаю, что работает следующий универсальный метод:
public static <K,V> void printer(HashMap<K, ArrayList<V>> list) { }
Что ведет себя так, как я думал ArrayList<?>
будет работать. Может кто-нибудь объяснить здесь тонкости?