为什么Stream.generate使用非方差,而Optional.oElseGet在Java 8中使用协方差



对于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的生产者。

相关内容

  • 没有找到相关文章

最新更新