通过示例更容易解释。我有一个Base
特征,它定义了类型Rec
:
trait A
trait B
trait C
trait Base {
type Rec <: A
def foo(r: Rec): Rec = ???
}
现在我想为Base
创建'richhers',它在overrode方法上使用抽象覆盖修饰符添加一些功能,同时使类型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
编译器拒绝这种说法基本上Rec
中的Enricher1
和Rec
中的Enricher2
类型不相容,我非常同意他的看法。请注意,它使用单个richher进行编译。
所以,而不是写
override type Rec <: Base#Rec with B
我宁愿说:给我与Rec已经相同的类型,但是添加with X
。我试过了
override type Rec <: super.Rec with B
但是编译器也拒绝了“循环别名”错误。
我该怎么做?
答案 0 :(得分:0)
如果我正确理解你要做的事情,我认为这是可以做到的:
trait A
trait B
trait C
trait Base {
type Rec <: A
def foo(r: Rec): Rec = ???
}
trait Enricher1 extends Base {
override type Rec <: Base#Rec with C
abstract override def foo(r: Rec): Rec = ??? // uses super.foo
}
trait Enricher2 extends Enricher1 {
override type Rec <: Enricher1#Rec with B
abstract override def foo(r: Rec): Rec = ??? // uses super.foo
}
trait Concrete extends Base
trait Custom extends Concrete with Enricher2