为什么 Java Stream.map 需要一个函数<?超级 P_OUT, ?将 R> 映射器扩展为输入而不是 Function<P_OUT, ? extends R>?

Why does Java Stream.map take a Function<? super P_OUT, ? extends R> mapper as input instead of Function<P_OUT, ? extends R>?

为什么 map 将其输入作为 <? super P_OUT, ? extends R> 类型的 Function 而不是 <P_OUT, ? extends R>

例如,当我这样做时,

List<Integer> list = new ArrayList<>();
list.stream().map(xyz -> {}); // Here xyz is always of type Integer for this instance. 
                              // Then why does it take input as "? super Integer"?

是不是因为没有限制方法引用?这是唯一的用例吗?

通配符 <? super T> 允许您使用更广泛的类型集。

假设您有一些通用函数:

Function<Number, String> func = String::valueOf;

然后您可以执行以下操作:

List<Integer> list = List.of(1, 2);
Stream<String> stream = list.stream().map(func);

或以下内容:

List<Long> list = List.of(1L, 2L);
Stream<String> stream = list.stream().map(func);

这是可能的,因为 Stream.map(...) 的参数是:

Function<? super T, ? extends R> mapper;

这意味着,例如,如果 TLong1 类型,那么 <? super Long> 将允许函数接受Long 类型的元素,并且以下赋值也将有效:

Function<? super Long, ? extends String> mapper = func;

使用 Function<T, ? extends R> 以上两个示例甚至无法编译。


1 - 我们从 List<Long>.

的元素构造 Stream<Long>