我已将我的问题缩小到以下最小(非)工作示例:
class Z
trait A[E <: Z] { type T[X <: E] <: A[X] }
trait B[E <: Z] extends A[E] { type T[X <: E] <: B[X] }
trait C[E <: Z, F[X <: Z] <: C[X, F]] extends A[E] { type T[X <: E] = F[X] }
class D[E <: Z] extends B[E] with C[E, D]
它是一种更高级的F-有界多态性(我使用T [E]作为某些方法的返回值)。当我尝试编译这段代码时,我得到:
error: overriding type T in trait B with bounds[X <: E] <: B[X];
type T in trait C, which equals [X <: E]D[X] has incompatible type
但是,鉴于D
是B
的子类型,同一E
传递给B
和C
,因此类型不应该& #39; t不相容。 Martin Odersky在这个question中解释说,当在mixin中合并一个成员时,有两个规则:1)具体而不是抽象和2)线性化顺序。在这种情况下,两者都是&#34;具体的&#34;类型所以我们去2)。但是线性化顺序表明C
应该胜过B
,所以我想知道我在这里出错了什么。