クラス値パラメーターにバインドされた型メンバーを使用すると、「型の不一致」エラーが発生するのはなぜですか?例えば:
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
そのような行動の理由は何ですか?
何が起こっているのか理解できたようです。クラスB
のある例では、値a
は型A
に明確な値を持たない型に変換されt
ます。抽象クラスの例でC
は、インスタンスは、の具体的な型を持つwithc
の値をオーバーライドします。言い換えれば、はのインスタンスではありません:それはその匿名サブクラスのインスタンスです。a
aInt
t
c
C
私はのタイプを知らせる例を変更した場合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
^
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加