[英]Scala - Covariance
根据协方差定义:
Q [+ B]表示Q可以取任何类,但如果A是B的子类,则Q [A]被认为是Q [B]的子类。
我们来看下面的例子:
trait SomeA
trait SomeB extends SomeA
trait SomeC extends SomeB
case class List1[+B](elements: B*)
val a = List1[SomeA](new SomeA{},new SomeB{})
val b = List1[SomeB](new SomeB{},new SomeC{})
一切都很好,但我不明白为什么List1[SomeB]
是的一个子类List1[SomeA]
或者换句话说,为什么b是一个子a
?
现在, List1[SomeB]
是的子类List1[SomeA]
这意味着你可以把其中需要后第一。
scala> case class List1[+B](elements: B*)
scala> val a = List1[SomeA](new SomeA{},new SomeB{})
a: List1[SomeA] = List1(WrappedArray($anon$2@3e48e859, $anon$1@31ddd4a4))
scala> val b = List1[SomeB](new SomeB{},new SomeC{})
b: List1[SomeB] = List1(WrappedArray($anon$2@5e8c34a0, $anon$1@7c1c5936))
scala> val c: List1[SomeA] = b
c: List1[SomeA] = List1(WrappedArray($anon$2@5e8c34a0, $anon$1@7c1c5936))
scala> val c: List1[SomeA] = a
c: List1[SomeA] = List1(WrappedArray($anon$2@3e48e859, $anon$1@31ddd4a4))
如果它不可能是不变的,请参阅:
scala> case class List1[B](elements: B*)
defined class List1
scala> val c: List1[SomeA] = b
<console>:16: error: type mismatch;
found : List1[SomeB]
required: List1[SomeA]
Note: SomeB <: SomeA, but class List1 is invariant in type B.
You may wish to define B as +B instead. (SLS 4.5)
val c: List1[SomeA] = b
^
scala> val c: List1[SomeA] = a
c: List1[SomeA] = List1(WrappedArray($anon$2@45acdd11, $anon$1@3f0d6038))
由于所有元件List1[SomeB]
是亚型SomeA
(如SomeB
延伸SomeA
),就可以简单地传递List1[SomeB]
其中List1[SomeA]
预计。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.