次のようなコード記述特性をいくつか見ました。
trait SelfAware { self: Self =>
....
}
class Self
val s = new Self with SelfAware // this is ok
println(s.self) // error happened
class X
new X with SelfAware // error happened here
なぜエラーが発生したのか、またこの方法で特性をどのように使用すればよいのかを知りたいです。
ベストアンサー1
エラーが発生するのは、this
参照 ( と名付けたself
) の型を 型に制限しているためですSelf
。 とした場合new Self with SelfAware
、そのオブジェクトは要求どおりの型であるため、問題ありませんSelf
。 しかし、 とした場合、が のサブタイプであるという証拠はまったくnew X with SelfAware
ありません。X
Self
型の新しいオブジェクトではX with SelfAware
、そのメンバーの型は何でしょうか? 型ではなく、型にself
なります。しかし、型である必要があるように特性を定義したので、型エラーが発生します。Self
X
SelfAware
self
Self