Scala 子类中的协方差

Scala 子类中的协方差,scala,Scala,Some[+A]中+A的目的是什么?如果我把它定义为代码>某些[A] < /代码>,它也将是协变的,我理解它继承了来自选项[A] 的协方差。 < P>不,不考虑这个情况: sealed trait Option[+A] case object None extends Option[Nothing] case class Some[A](get: A) extends Option[A] class C1() {} class C2() extends C1 {} val x1: Some[C

Some[+A]
+A
的目的是什么?如果我把它定义为代码>某些[A] < /代码>,它也将是协变的,我理解它继承了来自<代码>选项[A] 的协方差。

< P>不,不考虑这个情况:

sealed trait Option[+A]
case object None extends Option[Nothing]
case class Some[A](get: A) extends Option[A]

class C1() {}
class C2() extends C1 {}
val x1: Some[C1] = Some(new C2)           //> x1  : T.Some[T.C1] = Some(T$C2@4b5695c8)
val x2: Some[C2] = Some(new C2)           //> x2  : T.Some[T.C2] = Some(T$C2@664bb5d8)
// val x3: Some[C1] = x2 // Type mismatch
这是:

sealed trait Maybe[+A]
case object Empty extends Maybe[Nothing]
case class Just[A](x: A) extends Maybe[A]

scala> val j: Maybe[AnyRef] = Just[String]("Hello")
j: Maybe[AnyRef] = Just(Hello)
scala>val j:Just[AnyRef]=Just[String](“你好”)
:10:错误:类型不匹配;
找到:Just[字符串]
必需:仅[AnyRef]

注意:字符串编辑了我的问题,发生了一些奇怪的事情。它是否破坏了替换原则,或者我遗漏了一些简单的东西?@VictorMoroz:在您的更新中,
x1
上的类型注释驱动RHS的类型推断,因此
新C2
被推断为
C1
类型。将
C2
类型参数放在
Some
上,您将得到一个错误。
scala> val j: Just[AnyRef] = Just[String]("Hello")
<console>:10: error: type mismatch;
 found   : Just[String]
 required: Just[AnyRef]
Note: String <: AnyRef, but class Just is invariant in type A.
You may wish to define A as +A instead. (SLS 4.5)
       val j: Just[AnyRef] = Just[String]("Hello")