举个例子来解释会更容易理解。我有一个定义类型Rec
的Base
特质:
trait A
trait B
trait C
trait Base {
type Rec <: A
def foo(r: Rec): Rec = ???
}
现在我想为
Base
创建“增强器”,使用抽象重写修饰符在重写的方法上添加一些功能,同时使类型Rec
更具体(取决于增强器执行的具体任务):trait Enricher1 extends Base {
override type Rec <: Base#Rec with B
abstract override def foo(r: Rec): Rec = ??? // uses super.foo
}
trait Enricher2 extends Base {
override type Rec <: Base#Rec with C
abstract override def foo(r: Rec): Rec = ??? // uses super.foo
}
问题是:我无法混合我的增强剂:
trait Concrete extends Base
trait Custom extends Concrete with Enricher1 with Enricher2
编译器拒绝了这个,基本上是说在
Enricher1
和Enricher2
中类型为Rec
的不兼容,我非常同意他的说法。请注意,使用单个enricher可以编译。因此,我们需要改写成:
override type Rec <: Base#Rec with B
我更倾向于这样说:给我与Rec已有类型相同的内容,但加上
with X
。我尝试过了。override type Rec <: super.Rec with B
但是编译器也会报错,显示“循环别名”,我该怎么办?
我该如何解决这个问题?
type
前面移除override
吗?让它简单地变成type Rec <: C
。这样应该允许你混合所有的 traits。 - Arseniy Zhizhelevself.foo
只是foo,而不是super.foo
。这只有在抽象覆盖(abstract override)的情况下才可能实现。 - Tvaroh