为什么map
将其输入作为类型为Function
的{{1}}而不是<? super P_OUT, ? extends R>
?
举例来说,
<P_OUT, ? extends R>
是因为不限制方法引用吗?那是唯一的用例吗?
答案 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>
。