告诉我为什么Scala说:“类型META具有不兼容的类型”

时间:2011-08-14 11:03:40

标签: scala

在仅使用泛型无法获得所需结果后,我决定尝试使用类型。不幸的是,我甚至更早地陷入了仿制药的困境。这是我的代码:

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兼容。

2 个答案:

答案 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]

...它编译,但我不确定这是否是你想要的。