2015-04-19 12 views
10

Ho un tratto per il quale so che l'uguaglianza di riferimento non è mai l'implementazione corretta di equals. Le implementazioni del tratto possono essere scritte da molti utenti e la pratica mostra che a volte non riescono a sovrascrivere equals. C'è un modo per richiederlo?Forzare tutte le implementazioni di un tratto da sovrascrivere uguale a

In implementazioni pratiche sono solitamente classi case che Override equals automaticamente, e ci si può avvicinare da che avendo Product come auto-tipo di tratto, però, vorrei vedere una soluzione che permette non -categorie di classi che prevalgono su equals (MODIFICA: utilizzare scala.Equals in quanto il tipo di utente è un'approssimazione più vicina a ciò che desidero, poiché è ancora implementato automaticamente dalle classi del caso, ma può essere implementato utilmente da classi non casistiche e non è un grande onere per le persone che scrivono le implementazioni).

Un altro approccio a cui ho pensato durante la scrittura di questa domanda è di ignorare equals nel tratto per chiamare un metodo astratto, ma sfortunatamente, questo non funziona per le implementazioni di case class.

+1

Che dire - trait Foo { di override def uguale (obj: Scala. Qualsiasi): booleano = ??? } – Maxim

+0

Potresti descrivere di più su _doesn't lavoro per implementazioni di case class_? [Questo foglio di lavoro] (https://gist.github.com/Odomontois/865d91180cc2e30435bf) ha funzionato bene per me – Odomontois

+0

@Maxim Il problema è che quando 'equals' viene ridefinito in un antenato di una classe del caso, l'implementazione non viene generata. –

risposta

2

Perché non utilizzare il contratto per la tipologia invece di puro tratto? We have one already in scalaz, ed è facile da incollare con Equals tratto:

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 

Se avete bisogno di collegare questo con il vostro carattere, there is your own nice solution

Problemi correlati