特性を考えるとT
trait T {
def v: Int
def +(t: T): T
}
次のクラスA
case class A(v: Int) extends T {
def +(a: A) = A(v + a.v)
}
の有効なサブタイプではありませんT
。の実装は、 type の要素のみを受け入れるのに対し、 の署名ではすべての実装が typeのオブジェクトだけでなく、 type のオブジェクトを受け入れることができる必要があるA.+
ため、制限が厳しすぎます。これまでのところ、とても合理的です。A
T.+
T
A
の実装を制限的にしたい場合は、次のようにandT
の宣言を変更できます。T
A
trait T[This <: T[This]] {
def v: Int
def +(t: This): This
}
case class A(v: Int) extends T[A] {
def +(a: A) = A(v + a.v)
}
これは明らかに型シグネチャを爆破します。
T
の実装が独自の型のオブジェクトと互換性があるだけでよいことを宣言する別の方法はありますか?
1st EDIT以下のLandeiの回答への返信:
自己型は実際に現在の署名を短縮しますT
が、発生する他の署名を短縮しません。
trait C[D <: T[D], S] { self: S =>
def +(perm: D): S
def matches(other: S): Boolean
}