通配符扩展最终可选 class

Wildcard extending final Optional class

Optional class 在 Java 中被声明为 final。然而,它包含两个方法,flatMapor,具有以下签名:

public <U> Optional<U> flatMap​(Function<? super T,​ ? extends Optional<? extends U>> mapper)

public Optional<T> or​(Supplier<? extends Optional<? extends T>> supplier)

Optional 永远无法扩展,那么这些签名中 ? extends Optional<...> 等部分的意义何在?为什么不只是 Optional<...>

从这里对 similar question 关于最终 String class 的回答,我只了解到编译器不必拒绝此类构造。考虑到给出的例子,我同意这一点。但我的问题更侧重于 API 设计,而不是编译器预测所有可能用例的能力。为什么有些人需要允许 Supplier 产生一些不可能的 class 扩展 Optional 实例的可能性?

class Optionalfinal,因此不能有子class,但它是通用的,因此允许无限数量的 参数化类型 具有自己的子类型关系。

例如,由于您在问题中显示的签名,以下代码才有效:

Optional<Object> o = Optional.empty();
Supplier<Optional<String>> s = () -> Optional.of("str");
Optional<Object> combined = o.or(s);

Optional<String> 不是 Optional<Object> 的子类型,因此签名中需要 Optional<? extends T>,因为 Optional<String>Optional<? extends Object> 的子类型.

但是 Supplier<Subtype> 不是 Supplier<Supertype> 的子类型,所以我们需要 Supplier<? extends Supertype> 来允许子类型的供应商,而 Optional<? extends T> 是这里的超类型。

所以 Supplier<Optional<String>>Supplier<? extends Optional<? extends Object>> 的子类型。