Scala标准库包含Option
类型。
选项类型本身是协变类型,从其声明sealed abstract class Option[+A]
可以明显看出这一点。
问题是:
为什么它的构造函数Some
也是协变的final case class Some[+A](x: A) extends Option[A]
?
这是模式匹配所需要的吗?
或者,这样做可能是为了更好的可读性?
对我来说,这似乎是多余的,因为我认为除了模式匹配之外,没有任何理由在任何地方直接使用Some
,但目前我看不出它如何依赖于协方差。
1条答案
按热度按时间bvjxkvbb1#
首先,您必须理解,正如@Dima所说,
Some[T]
不是构造函数,而是Option[T]
的子类。一旦我们确定了这一点,用
Dog
和Animal
解决有差异的问题总是更容易:Some[Dog]
是Some[Animal]
吗?我想你会同意答案是肯定的。实际上,它不会有太大变化,因为您很少使用
Some[Dog]
,而是使用Option[Dog]
,但它可能会发生(例如,当您使用签名返回Some[Tuple]
的Case类的unapply
时),那么为什么不在我们处理它的时候添加方差呢?