我有以下代码片段:
sealed trait Option[+A] {
def map[B](f: A => B): Option[B] = this match {
case None => None
case Some(a) => Some(f(a))
}
def getOrElse[B>:A](default: => B): B = this match {
case None => default
case Some(a) => a
}
def orElse[B>:A](ob: => Option[B]): Option[B] =
this.map(Some(_)).getOrElse(ob)
}
case class Some[+A](get: A) extends Option[A]
case object None extends Option[Nothing]
该函数orElse
有一个ob
类型为 的参数Option[B]
。在函数体中,我传递ob
给函数,getOrElse
但它需要一种类型B
,这怎么可能?
因为B
可以是任何类型?
类型A
在顶部标识一次。B
另一方面,Type正在每个方法中单独标识/定义。
因此,如果orElse
接收到Option[B]
某个未知类型的anB
并将其传递给getOrElse
then,就目前getOrElse
而言,它将成为新的B
.
这可能使一些更有意义,如果你使用过C
,而不是B
为getOrElse
方法,并使用D
替代B
的orElse
方法。一切都会一样,但更容易看到非关系。
它类似于值参数。如果我们有一个方法f(x:Int) = g(x-1)
,则调用接收到的参数x
。该方法g(x: Int)=...
还调用其参数,x
但这并不意味着值相同。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句