我有一个特性,我知道引用相等性永远不是equals
的正确实现。许多用户可以编写特征的实现,并且练习表明有时他们无法覆盖equals
。有没有办法要求它?
在实践中,实现通常是案例类,它会自动覆盖equals
,我们可以通过将Product
作为特征的自我类型来处理那个,但是,我希望看到一个允许非案例类重写equals
的解决方案(编辑:使用scala.Equals
作为自我类型更接近我想要的,因为它& #39;仍然由案例类自动实现,但可以通过非案例类有用地实现,并且对编写实现的人来说不是很大的负担。
在编写此问题时我想到的另一种方法是覆盖特征中的equals
来调用抽象方法,但不幸的是,这对于案例类实现并不起作用。
答案 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
进行连接