我有一个trait,它接受一个类型参数,我想说实现这个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 =>
// ...
}
然后错误消失。
为什么我必须在每个非具体类型中重复相同的声明。如果我有一个基类,并说“扩展 Comparable”,我不必在每个派生类型中重复“扩展 Comparable”,只要具体类实现 compareTo 方法。我想这里应该是一样的。我只是说扩展 HandleOwner 的类型也是SELF,编译器应该接受它,并考虑它,而不需要每个非具体子类型再次重复相同的事情。
A 这样做是为了避免必须使用类转换,但我将从字面上扩展这个特性的每个类,我不认为我应该重复这个声明数百甚至数千次!