2016-09-04 22 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