2016-09-04 18 views
1

我定義的包裝類的首要等於:階:基本類型

class Wrapper[T](private val value: T) 

,我想確保W(V1)== v2和V2 = W(V1)當且僅當V1 = = v2。第一部分很簡單,因爲您可以覆蓋Wrapper類的equals方法。但問題是相反的,使得5 == Wrapper(5)例如返回true,實現了相等的對稱性。是否有可能在Scala中,您可以重寫像Int或String這樣的基本類型的equals方法?在C++中,你可以覆蓋運算符==(A,int)和運算符==(int,A),但對java或scala來說似乎不那麼重要。

+0

第一部分IMO也並不容易:'equals'具有簽名'等於(X:任何):布爾和'T'被擦除。 –

+1

你真的需要'=='嗎?很容易在兩個方向上定義獨立方法,或者隱式定義另一種方法。您無法真正覆蓋'Int'中的'==',因爲它已經在那裏了。 –

回答

2

它如何可能與implicits(請注意,無論是==也不equals這裏可以使用)來完成:

import scala.reflect.ClassTag 

implicit class Wrapper[T : ClassTag](val value: T) { 
    def isEqual(other: Any) = other match { 
    case x: T => 
     x == value 
    case x: Wrapper[T] => 
     x.value == value 
    case _ => 
     false 
    } 
} 

5 isEqual (new Wrapper(5)) // true 
(new Wrapper(5)) isEqual 5 // true 
+0

v酷。一個覆蓋所有案例的優雅解決方 – Samar