【问题标题】:scala: overriding equals of basic typesscala:覆盖基本类型的等于
【发布时间】:2017-01-11 18:25:52
【问题描述】:

我已经定义了一个包装类:

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 中似乎并非如此。

【问题讨论】:

  • 第一部分IMO也不容易:equals有签名equals(x: Any): BooleanT被删除。
  • 你真的需要==吗?很容易在两个方向上定义一个独立的方法,或者隐式定义另一个方法。您不能真正在 Int 中覆盖 ==,因为它已经存在。

标签: java scala equals equality


【解决方案1】:

如何使用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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 2013-05-25
    • 2012-02-20
    • 2023-03-31
    • 2018-07-31
    • 2020-03-14
    • 1970-01-01
    相关资源
    最近更新 更多