有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

泛型为什么流。生成使用非变量,但可选。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) 个答案

  1. # 1 楼答案

    看起来Java开发人员同意您的意见,即generate应该接受Supplier<? extends T>,因为它在Java 9中被更改了。见JDK-8132097 (Stream.generate should use a covariant Supplier as parameter)

    Description

    The signature of Stream.generate doesn't to use a wildcard (? extends) hence some programs are rejected even if they are valid. The signature should be public static Stream generate(Supplier<? extends T> s).

    这种改变是有意义的,因为做了这样的事情:

    Stream<CharSequence> stream = Stream.generate(new Supplier<String>() {
        @Override public String get() {
          // implementation...
        }
    });
    

    应该完全有效。诚然,这是一个非常做作的例子,但重点是:Supplier应该允许用T的任何子类型进行参数化。与PEC相关的是SupplierT的产生者