2015-04-19 12 views
10

Ich habe eine Eigenschaft, für die ich weiß, dass Referenzgleichheit ist nie die korrekte Implementierung von equals. Implementierungen des Merkmals können von vielen Benutzern geschrieben werden, und die Praxis zeigt, dass sie es manchmal nicht schaffen, equals zu überschreiben. Gibt es eine Möglichkeit, es zu verlangen?Erzwingen alle Implementierungen eines Merkmals zu überschreiben ist gleich

In der Praxis Implementierungen sind in der Regel Fallklassen, die Überschreibung equals automatisch, und wir nähern können, indem Product als Selbst Typ des Merkmals dass erfordern, würde ich aber gerne eine Lösung finden, die nicht erlaubt - Fallklassen überschreiben auch equals (BEARBEITEN: Verwenden scala.Equals als der Selbst-Typ ist eine nähere Annäherung an das, was ich will, da es immer noch von Fall-Klassen implementiert wird, aber nützlich sein kann durch nicht-Fall-Klassen und ist kein große Belastung für Leute, die Implementierungen schreiben).

Ein weiterer Ansatz, an den ich beim Schreiben dieser Frage gedacht habe, ist das Überschreiben equals im Merkmal, um eine abstrakte Methode aufzurufen, aber das funktioniert leider nicht für Fallklassenimplementierungen.

+1

Was - Merkmal Foo { Überschreibung def gleich (obj: scala. Beliebig): Boolesch = ??? } – Maxim

+0

Können Sie mehr über _does nicht für Fallklassenimplementierungen_ beschreiben? [Dieses Arbeitsblatt] (https://gist.github.com/Odomontois/865d91180cc2e30435bf) funktionierte gut für mich – Odomontois

+0

@Maxim Das Problem ist, dass wenn "Equals" in einem Vorgänger einer Fallklasse neu definiert wird, die Implementierung nicht generiert wird. –

Antwort

2

Warum nicht Typklasse Vertrag anstelle von reinem Merkmal verwenden? We have one already in scalaz, und es ist einfach, es mit Equals Charakterzug zu kleben:

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 

Wenn Sie dies mit Ihrem Zug müssen verdrahten, there is your own nice solution

Verwandte Themen