在仅使用泛型无法获得所需结果后,我决定尝试使用类型。不幸的是,我甚至更早地陷入了仿制药的困境。这是我的代码:
trait Base[B <: Base[B]] {
type META = Meta[B]
def meta: META
}
trait Meta[B <: Base[B]]
trait EnumBase[B <: EnumBase[B]]
extends Base[B] with Ordered[B] {
override type META = EnumMeta[B]
}
trait EnumMeta[B <: EnumBase[B]]
extends Meta[B] with Iterable[B]
我从Scala编译器获得了EnumBase中“类型META具有不兼容类型”的信息。这是为什么? EnumBase 是一个Base,而EnumMeta 是一个Meta,因此EnumMeta [EnumBase] 与Meta [Base] IMHO兼容。
答案 0 :(得分:4)
你不能覆盖一个完全设置的类型成员,你可以对它设置更强的约束(它的类型是抽象的,例如type Meta <: Meta[B]
),完全不会放弃先前的约束。
如果允许,你所做的事情会不健全。您可以在子类中随意更改方法签名,前提是您在基类中使用了类型别名(您拥有的只是那个,类型别名)
关于泛型vs类型成员的问题,它不是一个明确的问题,但我认为当它们没有出现在特征的公共接口中时,类型成员肯定更好,在这种情况下,客户端不应该被打扰提到它。如果是,(这里是meta
的结果),我会首先考虑泛型。
答案 1 :(得分:3)
使用此...
trait Base[B <: Base[B]] {
type META <: Meta[B]
def meta: META
}
trait Meta[B <: Base[B]]
trait EnumBase[B <: EnumBase[B]]
extends Base[B] with Ordered[B] {
type META = EnumMeta[B]
}
trait EnumMeta[B <: EnumBase[B]]
extends Meta[B] with Iterable[B]
...它编译,但我不确定这是否是你想要的。