【发布时间】:2010-12-14 11:09:48
【问题描述】:
给定一个特征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.+ 的实现过于严格,因为它只接受 A 类型的元素,而 T.+ 的签名要求所有实现都能够接受 T 类型的对象,而不仅仅是 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's answer below:
虽然自我类型确实缩短了当前签名,但它们不会缩短出现 T 的其他签名,例如
trait C[D <: T[D], S] { self: S =>
def +(perm: D): S
def matches(other: S): Boolean
}
【问题讨论】:
标签: generics inheritance scala signature variance