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

Ale*_*nov 10 scala

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

在实践中的实现通常是区分类,它们重写equals自动的,我们可以接近需要的是由具有Product作为自型性状的,但是,我想看到的溶液,其允许非case类重写equals以及(EDIT :使用scala.Equals自我类型是我想要的更接近,因为它仍然由案例类自动实现,但可以通过非案例类有用地实现,并且对编写实现的人来说不是一个很大的负担).

我在编写这个问题时想到的equals另一种方法是在特征中覆盖以调用抽象方法,但不幸的是,这不适用于案例类实现.

Odo*_*ois 2

为什么不使用类型类契约而不是纯特征?我们已经有了一个scalaz并且很容易将它与EqualsTrait 粘合起来:

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
Run Code Online (Sandbox Code Playgroud)

如果您需要将其与您的特质联系起来,这里有您自己的不错的解决方案