这是一个让我头疼的特征线性化谜题。我基本上有类型Node
,它定义equals
并hashCode
与其他Node
s 进行比较。而且我有一个Selector
类型,可以将 aNode
与额外的数据一起包装,因此有自己的类型equals
,hashCode
可以与其他Selector
s 进行比较。
现在我有一个Standalone
结合Node
and的类型Selector
,但是我得到不一致的(?)关于equals
and的线性化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 被称为)当我从Event
or扩展时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
和hashCode
from Selector
toStandalone
除外),这将非常感激。
这是 Scala 2.9.2。