函数输入类型的泛型有界通配符

2022-09-03 03:49:06

在阅读接口源代码时,我发现了这种方法签名:Stream

<R> Stream<R> map(Function<? super T, ? extends R> mapper);

我想知道为什么输入类型是,而输出类型是,为什么不同时用于两者?mapper? super T? extends R? extends


答案 1

考虑您要将 一个映射到另一个(因此 )。哪些功能适合您?CharSequenceCharSequenceT = R = CharSequence

Function<Object, String> fn1 = Object::toString;

这对你有好处吗?是的,因为它可以采用任何(也是)并将其转换为(也是)。CharSequenceObjectStringCharSequence

Function<CharSequence, StringBuilder> fn2 = StringBuilder::new;

这对你有好处吗?是的,因为它可以采取任何并将其转换为(这也是)。CharSequenceStringBuilderCharSequence

Function<String, String> fn3 = String::trim;

这对你有好处吗?不,因为它不能采取任何,只有其中一些。CharSequence

因此,您可以看到第一个类型参数必须是或任何超类,但第二个类型参数必须是或任何子类。CharSequenceCharSequence


答案 2

由于PECS:) - 生产者扩展,消费者超级

生产者扩展 - 如果需要 List 来生成值(要从列表中读取 Ts),则需要使用T? extends T

Consumer Super - 如果需要 List 来使用值(要将 T 写入列表),则需要使用T? super T


推荐