我注意到,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 次 |
最近记录: |