2015-04-19 40 views
10

我有一個特徵,我知道引用相等性永遠不會是equals的正確實現。特質的實現可以由許多用戶編寫,並且練習顯示有時它們無法覆蓋equals。有沒有辦法來要求它?強制性狀的所有實現都覆蓋等於

在實踐中的實現通常是區分類,它們重寫equals自動的,我們可以接近由具有Product作爲自型性狀的要求,但是,我想看到的溶液,其允許非(編輯:使用scala.Equals作爲自我類型更接近我想要的東西,因爲它仍然由case類自動實現,但可以非常有用地通過非case類實現,而不是編寫實現的人員負擔很重)。

我在寫這個問題時想到的另一種方法是在特徵中重寫equals以調用抽象方法,但不幸的是,這對於案例類實現不起作用。

+1

什麼 - 特質富{ 覆蓋高清等於(OBJ:階。任何):布爾= ??? } – Maxim

+0

您能否介紹更多關於_doesn't工作的案例類實現_? [這個工作表](https://gist.github.com/Odomontois/865d91180cc2e30435bf)對我很好用 – Odomontois

+0

@Maxim問題是當'equals'在case類的祖先中重新定義時,不會生成實現。 –

回答

2

爲什麼不使用類型類合同而不是純特質? We have one alreadyscalaz,而且很容易與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