为什么可以传递其他类型

时间:2017-03-18 18:57:23

标签: scala

我有以下代码段:

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可以是任何类型吗?

1 个答案:

答案 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,但这并不意味着值相同。