对于Stream
类中的Java 8源代码:
public static<T> Stream<T> generate(Supplier<T> s) {
...
}
在Optional
类中
public T orElseGet(Supplier<? extends T> other) {
...
}
我已经读过这个帖子:PECS,但我有一些困惑。
为什么generate
方法参数(Supplier<T> s
(使用无方差,而orElseGet
方法参数(Supplier<? extends T> other
(使用协方差?
看起来Java开发人员同意generate
应该接受Supplier<? extends T>
,因为它在Java 9中进行了更改。参见JDK-8132097(Stream.generate应使用协变供应商作为参数(:
描述
Stream.generate的签名不使用通配符(?extends(,因此一些程序即使有效也会被拒绝。签名应该是公共静态流生成(供应商<?扩展T>s(。
这种改变是有意义的,就像这样做:
Stream<CharSequence> stream = Stream.generate(new Supplier<String>() {
@Override public String get() {
// implementation...
}
});
应该是完全有效的。诚然,这是一个非常人为的例子,但重点是:Supplier
应该被允许用T
的任何子类型进行参数化。为了将此与PECS联系起来,Supplier
充当T
的生产者。