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")