Inheritance scala中的自类型继承

Inheritance scala中的自类型继承,inheritance,scala,mixins,self-type,Inheritance,Scala,Mixins,Self Type,假设我有以下特点: trait A trait B { this: A => } trait C extends B // { this: A => } 编译器错误:非法继承;自我类型C与B的自我类型B不符合 正如预期的那样,如果我取消对self-type注释的注释,编译器会很高兴 我认为很明显为什么C也需要这种自我类型。我不明白的是,如果编译器已经知道它是需要的,为什么它不能从数据库中“继承”它 我认为,当你使用具有复杂层次结构的自我类型时,它可以减少冗长的内容,特别是如果你

假设我有以下特点:

trait A

trait B { this: A => }

trait C extends B // { this: A => }
编译器错误:
非法继承;自我类型C与B的自我类型B不符合
正如预期的那样,如果我取消对self-type注释的注释,编译器会很高兴

我认为很明显为什么C也需要这种自我类型。我不明白的是,如果编译器已经知道它是需要的,为什么它不能从数据库中“继承”它

我认为,当你使用具有复杂层次结构的自我类型时,它可以减少冗长的内容,特别是如果你混合了一大堆特征,每个特征都有自己的自我类型

我想目前的行为可能有一个很好的原因,我就是找不到/弄明白它是什么

起初我认为这可能与mixin线性化有关,但在我看来这并不适用(即使我有更多的特征与更复杂的自我类型混合在一起)

在某些情况下会不会造成歧义?如果是这样的话,为什么在没有歧义的情况下它就不能工作呢

还是与妥善执行有关

我可以找到一些关于这个话题的讨论(比如),但他们大多只是陈述问题并得出结论,没有太多的解释和/或解决方案(如果存在)

这不是唯一的解决办法。你也可以

trait AA extends A
trait C extends B with AA

也就是说,继承
A
接口的所有内容都被接受。如果您必须依赖于具体的实现,那么您将选择mixin;如果实现由用户决定,或者您有很好的理由不在trait中指定mixin(例如,为了缓解依赖性问题),您可以将其设置为self类型。

我想我很清楚在trait中混合与将其设置为self类型之间的区别。我的问题是:假设我希望前面的特性具有自类型和混合特性,并且编译器可以发现我需要(至少)A作为C的自类型,为什么它不能自动“添加”它?我认为这在很多情况下是不可取的,因为它会编译,而不会给你专门化类的机会。当
A
在当前范围内不可用时,该怎么办?我认为这会令人困惑,继承和混合应该明确。另外,当你想保存打字时,你可以用一个
来定义一个
字符,然后使用它。Debilski,你误解了这个问题。OP希望“trait C extends B”等同于“trait C extends B{this:A=>}”,而不是“trait C用A扩展B”。
trait AA extends A
trait C extends B with AA