问题描述
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
类的 similar question 的答案中,我只明白编译器不必拒绝此类构造。考虑到给出的例子,我同意这一点。但我的问题主要集中在 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>
是这里的超类型。
所以 Supplier<Optional<String>>
是 Supplier<? extends Optional<? extends Object>>
的子类型。