函数输入类型的泛型有界通配符
在阅读接口源代码时,我发现了这种方法签名: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
考虑您要将 一个映射到另一个(因此 )。哪些功能适合您?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
由于PECS:) - 生产者扩展,消费者超级
生产者扩展 - 如果需要 List 来生成值(要从列表中读取 Ts),则需要使用T? extends T
Consumer Super - 如果需要 List 来使用值(要将 T 写入列表),则需要使用T? super T