Принуждение всех реализаций признака для переопределения равных
У меня есть черта, для которой я знаю, что эталонное равенство никогда не является правильной реализацией 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
Если вам нужно связать это с вашей чертой, будет ваше собственное хорошее решение