泛型为什么流。生成使用非变量,但可选。orElseGet在Java8中使用协方差
对于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
)使用协方差,如何决定使用协方差或非方差
# 1 楼答案
看起来Java开发人员同意您的意见,即
generate
应该接受Supplier<? extends T>
,因为它在Java 9中被更改了。见JDK-8132097 (Stream.generate should use a covariant Supplier as parameter):这种改变是有意义的,因为做了这样的事情:
应该完全有效。诚然,这是一个非常做作的例子,但重点是:
Supplier
应该允许用T
的任何子类型进行参数化。与PEC相关的是Supplier
是T
的产生者