我有以下代码段:
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
可以是任何类型吗?
答案 0 :(得分:3)
类型A
在顶部标识一次。另一方面,类型B
正在每种方法中单独识别/定义。
因此,如果orElse
收到某个未知类型Option[B]
的{{1}}并将其传递给B
,那么就getOrElse
而言,那就变为getOrElse
新的B
。
如果您对C
方法使用B
而非getOrElse
,并使用D
代替B
,则可能会更有意义orElse
方法。一切都会起作用,但看到非关系会更容易。
它类似于价值参数。如果我们有方法f(x:Int) = g(x-1)
,则接收的参数称为x
。方法g(x: Int)=...
也调用其参数x
,但这并不意味着值相同。