为什么Java Stream.map接受Function <?超级P_OUT ,?扩展R>映射器作为输入,而不是Function <P_OUT,?扩展R>?

时间:2019-06-09 09:55:29

标签: java generics java-8 java-stream wildcard

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

举例来说,

<P_OUT, ? extends R>

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

1 个答案:

答案 0 :(得分:3)

通配符<? 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;

这意味着例如,如果T的类型为Long 1 ,则<? super Long>将允许函数接受类型为{{ 1}},以下分配也将生效:

Long

使用Function<? super Long, ? extends String> mapper = func; ,以上两个示例都无法编译。


1-我们根据Function<T, ? extends R>的元素构造Stream<Long>