java - 为什么 Optional 的 or 和 flatMap 方法的供应商类型参数是通配符?
问题描述
该Optional.or
方法是在 Java 9 中添加的。这是方法签名
public Optional<T> or(Supplier<? extends Optional<? extends T>> supplier)
既然是final类,为什么是Supplier
take的类型参数? extends Optional
而不是just ?Optional
Optional
该Optional.flatMap
方法也是如此。这是对 Java 8 的更改。
在 Java 8 中,它在 Java 9 中Function<? super T, Optional<U>> mapper
被更改为Function<? super T,? extends Optional<? extends U>>
。
解决方案
我从 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>>
推荐阅读
- javascript - 谷歌地图弹出标记信息仅显示数据库中的最后内容
- php - 使用 while 循环时服务器端 PHP 事件页面未加载
- command-line - 使用 AND 的 Liquibase 上下文
- sql - 按实体类型将多行合并为一行
- mongodb - 如何仅更新 mongodb 中的新数据或更改的值?
- node.js - 如何将环境变量从 docker-compose 传递到 NodeJS 项目中?
- scala - Scala & DataBricks:获取文件列表
- python - 在Python中查找用户输入的单词长度
- swift - 如何创建一个公共函数来显示 UICollectionView 中选定单元格的 indexPath
- java - 计数排序实现