具体来说,看getOrElse
.
ScalaOption
被定义为协变的,A
如下所示:
sealed abstract class Option[+A] extends Product with Serializable {
self =>
@inline final def getOrElse[B >: A](default: => B): B =
if (isEmpty) default else this.get
}
of 的定义getOrElse
似乎暗示A
必须返回一个超类型,这对我来说不一定很有意义。但实际上,它看起来像任何事情:子类型或超类型。
scala> class A
// defined class A
scala> class B extends A
// defined class B
scala> val optA: Option[A] = Option(null)
val optA: Option[A] = None
scala> optA.getOrElse(new B)
val res23: A = B@66a2c8e7
scala> class C extends B
// defined class C
scala> val optB: Option[B] = Option(null)
val optB: Option[B] = None
scala> optB.getOrElse(new A)
val res24: A = A@2a460bf
scala> optB.getOrElse(new C)
val res25: B = C@e87f97f
考虑到限制,这怎么可能?具体来说,我不明白optB.getOrElse(new C)
在给定约束的情况下如何允许getOrElse
(它应该返回 Option 类型参数的超类型)。