我有一个特性,我知道引用相等永远不是equals的正确实现。该特性的实现可以由许多用户编写,实践表明,有时他们无法覆盖equals。有什么办法来要求吗?
在实践中,实现通常是case类,它会自动覆盖equals,我们可以通过将Product作为特征的自我类型来实现这一要求,但是,我希望看到一种允许非案例类覆盖equals的解决方案(编辑:使用scala.Equals作为自类型更接近于我想要的,因为它仍然由案例类自动实现,但可以由非案例类有效地实现,而不是对编写实现的人造成很大负担)。
在编写这个问题时,我还想到了另一种方法,就是重写特征中的equals来调用抽象方法,但不幸的是,这并不适用于case类实现。
发布于 2015-04-20 14:31:10
为什么不使用类型契约而不是纯特性呢?我们已经有一个了 in 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如果你需要把它和你的特质连接起来,有你自己的好办法
https://stackoverflow.com/questions/29731199
复制相似问题