我有跟随ADT
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
}
}
case class Some[+A](get: A) extends Option[A]
case object None extends Option[Nothing]
我在getOrElse
函数中玩了一下:
scala> Some(4).getOrElse(44)
res1: Int = 4
scala> Some(4).getOrElse("Hello")
res2: Any = 4
为什么上一次返回Any
类型?
答案 0 :(得分:4)
您说过B
必须是A
的超级类型。
在第一个示例中,A
和B
都是整数,因此没有问题。
在第二个示例中,您有String和int。满足约束[B>:A]
的唯一超类型int是Any
。
这样想一下:你期望它会返回什么类型?您有一个int类型默认为String类型。该类型必须为Any
才能实现。