首页 > 解决方案 > 为什么 Optional 的 or 和 flatMap 方法的供应商类型参数是通配符?

问题描述

Optional.or方法是在 Java 9 中添加的。这是方法签名

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

既然是final类,为什么是Suppliertake的类型参数? extends Optional而不是just ?OptionalOptional

Optional.flatMap方法也是如此。这是对 Java 8 的更改。

在 Java 8 中,它在 Java 9 中Function<? super T, Optional<U>> mapper被更改为Function<? super T,​? extends Optional<? extends U>>

标签: javaoptionaljava-9supplier

解决方案


我从 Stuart Marks 本人那里找到了背后的原因

http://mail.openjdk.java.net/pipermail/core-libs-dev/2016-October/044026.html

这与嵌套泛型(Optional嵌套在内部Function)有关。从邮件线程

 Function<..., Optional<StringBuilder>>

不是的子类型

 Function<..., Optional<? extends CharSequence>>

为了解决这个问题,我们还必须添加外部通配符,这样

 Function<..., Optional<StringBuilder>>

是一个子类型

 Function<..., ? extends Optional<? extends CharSequence>>

推荐阅读