通配符扩展 final Optional 类

问题描述

Optional 类在 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<...>

从这里关于最终 String 类的 similar question 的答案中,我只明白编译器不必拒绝此类构造。考虑到给出的例子,我同意这一点。但我的问题主要集中在 API 设计上,而不是编译器预测所有可能用例的能力。为什么有些人需要考虑例如 supplier 产生扩展 Optional 的某些不可能的类的实例的可能性?

解决方法

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

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

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>> 的子类型。