【问题标题】:Forcing all implementations of a trait to override equals强制特征的所有实现覆盖等于
【发布时间】:2015-04-19 14:30:14
【问题描述】:

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

在实践中,实现通常是 case 类,它会自动覆盖 equals,我们可以通过将 Product 作为 trait 的自类型来接近要求 that,但是,我会希望看到一个允许非案例类也覆盖equals 的解决方案(编辑:使用scala.Equals 作为自我类型更接近我想要的,因为它仍然由案例类自动实现,但可以由非案例类有效地实现,对编写实现的人来说不是很大的负担)。

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

【问题讨论】:

  • 怎么样 - trait Foo{ override def equals(obj: scala.Any): Boolean = ??? }
  • 您能否详细描述一下不适用于案例类实现This worksheet 对我很好
  • @Maxim 问题是当equals在一个case类的祖先中被重新定义时,并没有生成实现。
  • @Odomontois 我希望案例类能够正常工作,因为它们已经重新定义了 equals,而不必定义类似 isEqual 的东西。

标签: scala


【解决方案1】:

为什么不使用 typeclass 契约而不是纯 trait? We have one alreadyscalaz 中,并且很容易将它与 Equals trait 粘合起来:

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

如果您需要将其与您的 trait 联系起来,there is your own nice solution

【讨论】:

    猜你喜欢
    • 2013-10-31
    • 2015-05-08
    • 2019-12-08
    • 1970-01-01
    • 2014-01-13
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    相关资源
    最近更新 更多