这是一个令我头痛的特质线性化益智游戏。我基本上输入了Node
,它定义了equals
和hashCode
与其他Node
s进行比较。而且我有一个Selector
类型,它可能包含Node
以及额外的数据,因此有其自己的equals
和hashCode
可与其他Selector
进行比较。搞砸特质线性化?
现在我有一个Standalone
型相结合的Node
和Selector
,但我得到不一致的关于线性化,以equals
和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
或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!!!!!!!!
我做了一个小.DOT图(混入由左到右排列):
所以,如果我正确理解linearisation rules,我应该总是以Selector
执行hashCode
。对于这种行为的唯一解释是,涉及某种贪婪/深度优先的事物......?
此外,如果有一种技术,我可以使用,以确保无论何时Standalone
混入,确保了Selector
否决Node
(比Selector
到Standalone
复制equals
和hashCode
等),这将是非常赞赏。
这是与斯卡拉2.9.2。
_keeping只有最右边的一个_...好的,这样看来是问题了。我想没有办法在'Standalone'中重新实现这些方法...... –
'Standalone'在两个对象的线性化中位于'Node'和'Selector'之前,因此您可以在其中覆盖它。然而,这一切对我来说似乎都很脆弱,你可能会更好地重新设计它。 – Kaito