Принуждение всех реализаций признака для переопределения равных

У меня есть черта, для которой я знаю, что эталонное равенство никогда не является правильной реализацией equals. Реализации признака могут быть написаны многими пользователями, и практика показывает, что иногда они не могут переопределить equals. Есть ли способ его потребовать?

На практике реализации обычно представляют собой классы case, которые автоматически переопределяют equals, и мы можем подойти, требуя, чтобы, имея Product в качестве самонапряжения признака, я бы хотел увидеть решение, которое позволяет классы, не относящиеся к случаю, переопределяющие equals (EDIT: Использование scala.Equals, поскольку самонастройка является более близким приближением к тому, что я хочу, поскольку оно по-прежнему автоматически выполняется классами case, но может быть полезно реализовано классами, отличными от случая и не является большой нагрузкой для людей, пишущих реализации).

Еще один подход, о котором я думал при написании этого вопроса, - переопределить equals в признаке, чтобы вызвать абстрактный метод, но, к сожалению, это не работает для реализации классов case.

Ответ 1

Почему бы не использовать контракт типа typeclass вместо чистого признака? У нас уже есть в 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

Если вам нужно связать это с вашей чертой, будет ваше собственное хорошее решение