通配符扩展最终可选类



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类的类似问题的答案中,我只明白编译器不必拒绝这样的构造。考虑到所举的例子,我同意这一点。但我的问题主要集中在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>在这里是超类型。

因此CCD_ 20是CCD_ 21的一个亚型。

最新更新