1

共分散の定義によると:

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かわかりません。

4

2 に答える 2

2

これは、後者が必要な場所に最初のものを配置できることを意味する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))
于 2016-04-29T10:13:48.630 に答える
1

のすべての要素は(as extends )List1[SomeB]のサブタイプであるため、必要な場所を単純に渡すことができます。SomeASomeBSomeAList1[SomeB]List1[SomeA]

于 2016-04-29T10:16:01.233 に答える