3

クラス値パラメーターにバインドされた型メンバーを使用すると、「型の不一致」エラーが発生するのはなぜですか? 例えば:

scala> class A { type t }
defined class A

scala> class B(val a: A)
defined class B

scala> val aInt = new A { type t = Int }
aInt: A{type t = Int} = $anon$1@6ccc7368

scala> val b = new B(aInt)
b: B = B@834518

scala> val i: b.a.t = 1
<console>:11: error: type mismatch;
 found   : Int(1)
 required: b.a.t
       val i: b.a.t = 1
                      ^

奇妙なことに、クラス パラメータとして定義されていない値を使用すると、すべて正常に動作します。

scala> abstract class C { val a: A }
defined class C

scala> val c = new C { val a = aInt }
c: C{val a: A{type t = Int}} = $anon$1@1e815aad

scala> val i: c.a.t = 1
i: c.a.t = 1

そのような行動の理由は何ですか?

4

1 に答える 1

1

何が起こっているのか理解できたようです。class の例でBは、値は typeに明確な値を持たないatype に変換されます。抽象クラスの例では、インスタンスは の具体的な型を持つの値をオーバーライドします。言い換えれば、のインスタンスではありません。それは、その無名サブクラスのインスタンスです。AtCcaaInttcC

cの型を明示的に示す例を変更するとC、最初のケースと同じエラーが発生します。

scala> class A { type t }
defined class A

scala> val aInt = new A { type t = Int }
aInt: A{type t = Int} = $anon$1@3b8590c5

scala> abstract class C { val a: A }
defined class C

scala> val c: C = new C { val a = aInt }
c: C = $anon$1@5f14a3c6

scala> val i: c.a.t = 1
<console>:11: error: type mismatch;
 found   : Int(1)
 required: c.a.t
       val i: c.a.t = 1
                      ^
于 2013-10-30T15:21:22.383 に答える