加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

了解Scala中的Option.flatten

发布时间:2020-12-16 08:49:56 所属栏目:安全 来源:网络整理
导读:我注意到Option.flatten是 defined如下: def flatten[B](implicit ev: A : Option[B]): Option[B] = if (isEmpty) None else ev(this.get) 什么是ev在这里?什么是A:选项[B]是什么意思?它是干什么用的 ? 解决方法 这是限制针对特定类型执行某些方法的常
我注意到Option.flatten是 defined如下:

def flatten[B](implicit ev: A <:< Option[B]): Option[B] =
    if (isEmpty) None else ev(this.get)

什么是ev在这里?什么是A<:<选项[B]是什么意思?它是干什么用的 ?

解决方法

这是限制针对特定类型执行某些方法的常见做法.实际上,<:<是scala.Predef中定义的类型,如下所示:

@implicitNotFound(msg = "Cannot prove that ${From} <:< ${To}.")
sealed abstract class <:<[-From,+To] extends (From => To) with Serializable
...
implicit def conforms[A]: A <:< A = ...

因此,只有当A是B的子类型时,才能解析类型<:< [A,B]的隐式. 在这种情况下,只有当Option包含在另一个Option中时才能解析它.在任何其他情况下,将发生编译错误:

scala> Option(42).flatten
<console>:8: error: Cannot prove that Int <:< Option[B].
          Option(42).flatten
                     ^

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读