scala:覆盖基本类型的等价物

scala: overriding equals of basic types

提问人:K J 提问时间:9/4/2016 更新时间:9/4/2016 访问量:160

问:

我定义了一个包装类:

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

我想确保 w(v1) == v2 和 v2 == w(v1) iff v1 == v2。第一部分很简单,因为您可以覆盖 Wrapper 类的 equals 方法。但问题是相反的,例如,使 5 == Wrapper(5) 返回 true,从而实现相等的对称性。在 scala 中,您是否可以覆盖 Int 或 String 等基本类型的 equals 方法?在 C++ 中,您可以覆盖 operator==(A, int) 和 operator==(int, A),但 java 或 scala 似乎并非如此。

Java Scala 等于 平等

评论

0赞 Victor Moroz 9/4/2016
第一部分IMO也不容易:有签名并被擦除。equalsequals(x: Any): BooleanT
1赞 Victor Moroz 9/4/2016
你真的需要吗?在两个方向上定义一个独立方法,或者隐式定义另一个方法,都很容易。你不能真正覆盖它,因为它已经存在了。====Int

答:

2赞 Victor Moroz 9/4/2016 #1

如何用隐式来完成它(请注意,这里既不能使用,也不能使用):==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