给定一个特征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
。的实现A.+
过于严格,因为它只接受 type 的元素,A
而 的签名T.+
要求所有实现都能够接受 type 的对象,T
而不仅仅是 type 的对象A
。到目前为止,很合理。
如果我想让 的实现具有T
限制性,我可以修改 和 的声明,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
只需要与它们自己类型的对象兼容?
第一次编辑回复Landei的回答如下:
虽然自我类型确实缩短了当前签名,但它们不会缩短T
出现的其他签名,例如
trait C[D <: T[D], S] { self: S =>
def +(perm: D): S
def matches(other: S): Boolean
}