我注意到,Option.flatten被定义如下:
def flatten[B](implicit ev: A <:< Option[B]): Option[B] =
if (isEmpty) None else ev(this.get)
这是什么ev?什么A <:< Option[B]意思?它是干什么用的 ?
che*_*dze 14
这是限制某些方法针对特定类型执行的常见做法.实际上,<:<是一种定义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 = ...
Run Code Online (Sandbox Code Playgroud)
因此,<:<[A, B]只有当A是B的子类型时,才能解析隐式类型.
在这种情况下,只有Option在包裹在另一个中时才能解决它Option.在任何其他情况下,将发生编译错误:
scala> Option(42).flatten
<console>:8: error: Cannot prove that Int <:< Option[B].
Option(42).flatten
^
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3596 次 |
| 最近记录: |