Context
Я хочу использовать функцию computeIfAbsent
на Map
. Но я получаю ошибку компиляции при использовании
- ссылка на метод и ключ
String
.
Я не получаю ошибку компиляции при использовании
- ссылка на метод и ключ
Integer
.
- лямбда и ключ
String
.
Иллюстрация
Следующие утверждения законны :
Map<Integer, List<Long>> map = new HashMap<>();
Integer key = Integer.valueOf(0);
Long value = Long.valueOf(2);
map.computeIfAbsent(key, ArrayList::new).add(value); // No compilation error
Следующие утверждения запрещены :
Map<String, List<Long>> map = new HashMap<>();
String key = "myKey";
Long value = Long.valueOf(2);
map.computeIfAbsent(key, ArrayList::new).add(value); // Compilation error: The type ArrayList does not define ArrayList(String) that is applicable here
Следующие утверждения законны :
Map<String, List<Long>> map = new HashMap<>();
String key = "myKey";
Long value = Long.valueOf(2);
map.computeIfAbsent(key, x -> new ArrayList<>()).add(value); // No compilation error
Вопрос :
Я не понимаю, почему ключ String
такой особенный в сочетании со ссылкой на метод. Есть идеи?