为什么我不能使用 LinkedList::new?

Why can't I use 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 中看到无参数构造函数。 我在这里缺少什么,有人可以解释这种行为吗?

您可能打算将用于初始化的 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);

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

另一方面,

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

编译是,它有一个constructor accepting int argument但请注意它是为了列表的容量。

使用以下命令

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

所需的 lambda 必须具有签名 Function<? super K,? extends V> mappingFunction,因此当您编写时:

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

必须给出一个参数类型与 key (Integer) 兼容的构造函数。 ArrayList 有一个,LinkedList 没有:

ArrayList 的构造函数:

ArrayList()

ArrayList(Collection c)

ArrayList(int initialCapacity)

LinkedList 的构造函数:

LinkedList()

LinkedList(Collection c)

注意 它适用于 ArrayList 的事实可能不是一个好点,因为它构造了一个具有初始容量的空 ArrayList(可能会导致奇怪的边框效果)。

您可以参考Method reference in Java