我有一个特性,我知道引用相等性永远不是正确的实现equals.特性的实现可以由许多用户编写,并且实践表明有时他们无法覆盖equals.有办法要求吗?
在实践中的实现通常是区分类,它们重写equals自动的,我们可以接近需要的是由具有Product作为自型性状的,但是,我想看到的溶液,其允许非case类重写equals以及(EDIT :使用scala.Equals自我类型是我想要的更接近,因为它仍然由案例类自动实现,但可以通过非案例类有用地实现,并且对编写实现的人来说不是一个很大的负担).
我在编写这个问题时想到的equals另一种方法是在特征中覆盖以调用抽象方法,但不幸的是,这不适用于案例类实现.
为什么不使用类型类契约而不是纯特征?我们已经有了一个,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)
如果您需要将其与您的特质联系起来,这里有您自己的不错的解决方案