これは、スカラーでは何となく予期しない(または私の期待が間違っています)。したがって、次のいくつかのサンプルコードです:Scalaでの自己入力時の自動ミックスAPI
trait A
trait B
trait HasA { def foo: A }
trait HasB { def foo: B }
これまでのところは良い、私は
scala> trait HasBoth extends HasA with HasB
<console>:11: error: overriding method foo in trait HasA of type => A;
method foo in trait HasB of type => B has incompatible type
trait HasBoth extends HasA with HasB
がさてさて、私はエラーを参照しています。それは理にかなっている。
が、混乱は、次の来る:
trait Wrapper[T] { def get: T }
trait HasBoth2 { self: Wrapper[HasA with HasB] => def bar = get.foo }
この私はそれは非常識だ見つけました。 bar
のタイプを確認すると、B
となります。制約がHasB with HasA
であるように注文を裏返すと、bar
はA
になります。
ここでは矛盾があります。自動的
HasA with HasB
収量{ def foo: A with B }
、またはHasBoth2
は、型の非互換性のエラーを生成する:私は、のいずれかを期待します。
この不一致を親切に説明してください。それは型のシステムバグです。
更新HasBoth2の制約を満たしますラップ
trait HasBoth3 extends HasA with HasB { def foo: A with B }
type Wrapped = Wrapper[HasBoth3]
。
ここでは、型vsクラスの混乱のようです。型HasA with HasBは型制約に過ぎず、型trait HasBothはクラスを作成しようとしています。 – dmitry
@ドミトリーまだ自己タイピングを説明していません。型が制約に矛盾する – HuStmpHrrr
実際に型制約を満たすことができるのは「HasA with HasB」にキャストされた 'null 'だけなので、それは重要ではありません。 –