函数输入类型的泛型有界通配符
在阅读接口源代码时,我发现了这种方法签名:Stream
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
我想知道为什么输入类型是,而输出类型是,为什么不同时用于两者?mapper
? super T
? extends R
? extends
在阅读接口源代码时,我发现了这种方法签名:Stream
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
我想知道为什么输入类型是,而输出类型是,为什么不同时用于两者?mapper
? super T
? extends R
? extends
考虑您要将 一个映射到另一个(因此 )。哪些功能适合您?CharSequence
CharSequence
T = R = CharSequence
Function<Object, String> fn1 = Object::toString;
这对你有好处吗?是的,因为它可以采用任何(也是)并将其转换为(也是)。CharSequence
Object
String
CharSequence
Function<CharSequence, StringBuilder> fn2 = StringBuilder::new;
这对你有好处吗?是的,因为它可以采取任何并将其转换为(这也是)。CharSequence
StringBuilder
CharSequence
Function<String, String> fn3 = String::trim;
这对你有好处吗?不,因为它不能采取任何,只有其中一些。CharSequence
因此,您可以看到第一个类型参数必须是或任何超类,但第二个类型参数必须是或任何子类。CharSequence
CharSequence
由于PECS:) - 生产者扩展,消费者超级
生产者扩展 - 如果需要 List 来生成值(要从列表中读取 Ts),则需要使用T
? extends T
Consumer Super - 如果需要 List 来使用值(要将 T 写入列表),则需要使用T
? super T