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

ape*_*ite 2 java java-8 method-reference

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

现在List<Integer> values = computeIfAbsent(key, ArrayList::new);可以正常工作,但是List<Integer> values = computeIfAbsent(key, LinkedList::new);会引发编译错误。

我可以在ArrayList和LinkedList中看到no-arg构造函数。我在这里想念的是什么,有人可以解释这种现象吗?

Nam*_*man 7

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

List<Integer> values = map.computeIfAbsent(key, a -> new ArrayList<>());
Run Code Online (Sandbox Code Playgroud)

要么

List<Integer> values = map.computeIfAbsent(key, a -> new LinkedList<>());
Run Code Online (Sandbox Code Playgroud)

原因,为什么要代码

List<Integer> values = computeIfAbsent(key, LinkedList::new);
Run Code Online (Sandbox Code Playgroud)

无法编译的是最接近当前语法且带有单个参数的构造函数期望使用a Collection<? extends E> c而不是an Integer,因此无法解析。

另一方面,为什么

List<Integer> values = map.computeIfAbsent(key, ArrayList::new);
Run Code Online (Sandbox Code Playgroud)

compiles是,它具有接受int参数构造函数但请注意其对于列表的容量。