我有一个带有类型参数的特质(trait),我想表达实现了这个特质的对象也会符合这个类型参数(使用泛型为了兼容Java)
以下是代码:
trait HandleOwner[SELF <: HandleOwner[SELF]] {
self : SELF =>
// ...
def handle: Handle[SELF]
}
trait Common[SELF <: Common[SELF]] extends HandleOwner[SELF] {
// ...
}
给我以下错误:
illegal inheritance; self-type test.Common[SELF] does not conform to
test.HandleOwner[SELF]'s selftype SELF
如果我将 Common 改成:
trait Common[SELF <: Common[SELF]] extends HandleOwner[SELF] {
self : SELF =>
// ...
}
然后错误就消失了。
为什么我必须在每个非具体类型中重复相同的声明。如果我有一个基类,并说“extends Comparable”,只要具体类实现了compareTo方法,我不必在每个派生类型中重复“extends Comparable”。我认为这里应该是一样的。我只是说扩展HandleOwner也将是SELF,编译器应该接受它,并在考虑时考虑它,而不需要每个非具体子类型再次重复相同的事情。
我这样做是为了避免使用类转换,但我将从这个特性字面上扩展每个类,并且我不认为我应该重复这些声明数百甚至数千次!