强制特征的所有实现都覆盖等于

时间:2015-04-19 14:30:15

标签: scala

我有一个特性,我知道引用相等性永远不是equals的正确实现。许多用户可以编写特征的实现,并且练习表明有时他们无法覆盖equals。有没有办法要求它?

在实践中,实现通常是案例类,它会自动覆盖equals,我们可以通过将Product作为特征的自我类型来处理那个,但是,我希望看到一个允许非案例类重写equals的解决方案(编辑:使用scala.Equals作为自我类型更接近我想要的,因为它& #39;仍然由案例类自动实现,但可以通过非案例类有用地实现,并且对编写实现的人来说不是很大的负担。

在编写此问题时我想到的另一种方法是覆盖特征中的equals来调用抽象方法,但不幸的是,这对于案例类实现并不起作用。

1 个答案:

答案 0 :(得分:2)

为什么不使用类型类合约而不是纯粹的特质? We have one already中的scalaz,并且很容易将其与Equals特征粘合在一起:

import scalaz._

case class X(a:Int,b:Int)

class Y(a:Int,b:Int)

implicit def provideDefaultEqual[T <: Equals]:Equal[T] = new Equal[T] {
  def equal(a1: T, a2: T) = a1 == a2
}

implicitly[Equal[X]]

implicitly[Equal[Y]] //compile error

如果您需要使用特征there is your own nice solution

进行连接