9

假设我具有以下特征:

trait A

trait B { this: A => }

trait C extends B // { this: A => }

编译器错误:illegal inheritance; self-type C does not conform to B's selftype B with A
正如预期的那样,如果我取消注释 self 类型注释,编译器会很高兴。

我认为很明显为什么 C 也需要这种 self 类型。我不明白为什么如果编译器已经知道它需要它,它为什么不能从 A “继承”它?

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

我想目前的行为可能有充分的理由,我只是找不到/弄清楚它是什么。

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

在某些情况下会引起歧义吗?如果是这样,为什么在没有歧义的情况下它不能工作?

还是与正确实施的一些困难有关?

我可以找到有关该主题的一些讨论(例如self type is not dedicated),但他们大多只是陈述问题并得出结论,没有太多解释和/或解决方案(如果存在)。

4

1 回答 1

1
trait C extends B with A

不是唯一的解决方案。你也可以有

trait AA extends A
trait C extends B with AA

也就是说,所有继承了接口的东西都A被接受了。如果你必须依赖具体的实现,你会选择 mixin;如果实现取决于用户,或者您有充分的理由不在特征中指定 mixin(例如,为了放松依赖问题),您可以将其设为自类型。

于 2010-08-06T11:20:21.277 回答