2015-04-19 2 views
10

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

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

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

+1

насчет - черта Foo { переопределение Защиту равна (OBJ: Scala. Любой): Boolean = ??? } – Maxim

+0

Не могли бы вы подробнее рассказать о работе _doesn't для реализации класса case_? [Этот рабочий лист] (https://gist.github.com/Odomontois/865d91180cc2e30435bf) отлично сработал для меня – Odomontois

+0

@Maxim Проблема в том, что когда 'equals' переопределяется в предке класса case, реализация не генерируется. –

ответ

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

Смежные вопросы