为什么 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;
这意味着,例如,如果 T
是 Long
1 类型,那么 <? super Long>
将允许函数接受Long
类型的元素,并且以下赋值也将有效:
Function<? super Long, ? extends String> mapper = func;
使用 Function<T, ? extends R>
以上两个示例甚至无法编译。
1 - 我们从 List<Long>
.
的元素构造 Stream<Long>
为什么 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;
这意味着,例如,如果 T
是 Long
1 类型,那么 <? super Long>
将允许函数接受Long
类型的元素,并且以下赋值也将有效:
Function<? super Long, ? extends String> mapper = func;
使用 Function<T, ? extends R>
以上两个示例甚至无法编译。
1 - 我们从 List<Long>
.
Stream<Long>