Optional类在Java中被声明为final。然而,它包含两种方法,flatMap
和or
,具有以下签名:
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
的类的实例?
类Optional
是final
,因此不能有子类,但它是泛型的,因此允许无限多的参数化类型具有自己的子类型关系。
例如,以下代码仅因您在问题中显示的签名而有效:
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的一个亚型。