这是一个让我头疼的特征线性化谜题。我基本上有类型Node,它定义equals并hashCode与其他Nodes 进行比较。而且我有一个Selector类型,可以将 aNode与额外的数据一起包装,因此有自己的类型equals,hashCode可以与其他Selectors 进行比较。
现在我有一个Standalone结合Nodeand的类型Selector,但是我得到不一致的(?)关于equalsand的线性化hashCode:
trait Selector { override def hashCode = 1 }
trait Event extends Selector
trait Node { override def hashCode = 2 }
trait Standalone extends Node with Event
现在一切都很好(更具体的 hashCode 1 被称为)当我从Eventor扩展时Standalone:
object Single1 extends Event
Single1.hashCode // 1 -- ok
object Single2 extends Standalone
Single2.hashCode // 1 -- ok
如果我按以下顺序从两者扩展也很好:
object Compound1 extends Standalone with Event
Compound1.hashCode // 1 -- Ok
但是当我这样做时它搞砸了:
object Compound2 extends Event with Standalone
Compound2.hashCode // 2 -- no!!!!!!!!
我做了一个小点图(mixin 从左到右排序):

所以,如果我正确理解线性化规则,我应该总是hashCode以Selector. 这种行为的唯一解释是涉及某种贪婪/深度优先的事情......?
此外,如果我可以使用一种技术来确保无论何时Standalone混入,都可以确保Selector否决Node(复制equals和hashCodefrom SelectortoStandalone除外),这将非常感激。
这是 Scala 2.9.2。