Collectors.toList() 返回的收集器类型

use*_*403 2 java java-8

我对 Collectors.toList() 和 Collectors.toSet() 静态方法很困惑。这两种方法不接受任何参数。那么他们怎么知道要返回什么类型的 Collector 呢?

例如,如果我们有这一行:

Collectors.toList();
Run Code Online (Sandbox Code Playgroud)

返回的收集器是Collector<Object,?,List<Object>>

如果我们有这一行:

Collector<Integer,?,List<Integer>> c = Collectors.toList();
Run Code Online (Sandbox Code Playgroud)

然后 Collectors.toList() 将返回一个Collector<Integer,?,List<Integer>>. 在不接受任何输入参数的情况下, toList() 方法如何知道它需要返回一个Collector<Integer,?,List<Integer>>?

也许如何编写 toList() 的示例代码对我的理解会有所帮助。

提前致谢。

hol*_*ava 5

此功能在泛型类型推断中作为目标类型引入。

Java 编译器利用目标类型来推断泛型方法调用的类型参数。表达式的目标类型是 Java 编译器期望的数据类型,具体取决于表达式出现的位置。

例如:

//         v--- the generic parameter `T` is inferred by the target type 
Collector<Integer,?,List<Integer>> c = Collectors.toList();

//         v--- the unbounded type parameter is extends `Object`
Collectors.toList();
Run Code Online (Sandbox Code Playgroud)

  • @user3573403 类型推断是由 java 编译器实现的,而不是 java 源代码。如果将代码更改为 `Collector&lt;Integer,?,List&lt;String&gt;&gt; c = Collectors.toList();` 你发现代码无法编译,因为 `toList()` 方法只包含单个类型参数'T'。 (3认同)