首页 > 解决方案 > 为什么我不能使用 LinkedList::new?

问题描述

假设我有一个 HashMap 作为Map<Integer, List<Integer>> map = new HashMap<>();.

现在List<Integer> values = computeIfAbsent(key, ArrayList::new);可以完美运行,但List<Integer> values = computeIfAbsent(key, LinkedList::new);会引发编译错误。

我可以在 ArrayList 和 LinkedList 中看到无参数构造函数。我在这里缺少什么,有人可以解释这种行为吗?

标签: javajava-8method-reference

解决方案


您可能打算做的是将初始化的 Lamba 表达式指定为:

List<Integer> values = map.computeIfAbsent(key, a -> new ArrayList<>());

或者

List<Integer> values = map.computeIfAbsent(key, a -> new LinkedList<>());

原因,为什么代码

List<Integer> values = computeIfAbsent(key, LinkedList::new);

不会编译是最接近当前语法的具有单个参数的构造函数需要 aCollection<? extends E> c而不是 a Integer,因此无法解析。

另一方面,原因

List<Integer> values = map.computeIfAbsent(key, ArrayList::new);

compiles 是,它有一个接受int参数的构造函数,但请注意它的列表容量。


推荐阅读