【发布时间】:2011-08-14 12:48:14
【问题描述】:
我想执行以下操作,但“Iterable[BASE]”无法编译。在保持 BASE 为抽象类型的同时,正确的做法是什么?
trait Base
trait Meta {
type BASE <: Base
}
trait EnumBase extends Base with Ordered[EnumBase]
trait EnumMeta extends Meta with Iterable[BASE] {
override type BASE <: EnumBase
}
trait Manager extends EnumMeta {
override type BASE <: MetaBase
}
我希望对于扩展 EnumMeta 并重新定义 BASE 的每个特征,该特征将是它自己的 BASE 的 Iterable。到目前为止,我发现我可以这样做:
trait EnumMeta extends Meta with Iterable[EnumBase] {
override type BASE <: EnumBase
}
trait Manager extends EnumMeta with Iterable[MetaBase] {
override type BASE <: MetaBase
}
这是唯一的(重复的)方法,还是有更好的方法,只要它不需要返回泛型参数?
[EDIT] 我刚刚发现如果泛型类型参数是自类型,这将不起作用,如 Ordered[EnumBase]。如果您尝试在一个名为 MetaBase 的派生类中对其进行更多限制,您会得到:
illegal inheritance; self-type MetaBase does not conform to
Ordered[MetaBase]'s selftype Ordered[MetaBase]
【问题讨论】:
标签: generics scala abstract-data-type