为 case 类的 equals/hashCode 方法生成什么代码?

2022-09-01 20:27:51

我有一些Java代码,我正在将其翻译成Scala。

该代码由一些不可变的类组成,这些类将符合 Scala 中 a 的目的。case class

但是我不想引入错误,因此我想确保为和是/行为生成的代码等同于当前实现。equalshashCode

我已经看过“Scala编程”,但它只说

第三,编译器将方法的“自然”实现添加到String,hashCode和equals到你的类中。


答案 1

Scala有一个编译器选项,你可以用它来获取“它在内部使用的后键入源代码”。-Xprint:typer

scala -Xprint:typer -e 'case class Foo(a: String, b: Int)'

在这里,您会看到类似下面的内容:

override def hashCode(): Int = ScalaRunTime.this._hashCode(Foo.this);
override def toString(): String = ScalaRunTime.this._toString(Foo.this);
override def equals(x$1: Any): Boolean = Foo.this.eq(x$1).||(x$1 match {
  case (a: String,b: Int)this.Foo((a$1 @ _), (b$1 @ _)) if a$1.==(a).&&(b$1.==(b)) => x$1.asInstanceOf[this.Foo].canEqual(Foo.this)
  case _ => false
});

但是,这并不能告诉您哈希码是如何生成的。这是它的来源:

def _hashCode(x: Product): Int = {
  var code = x.productPrefix.hashCode()
  val arr =  x.productArity
  var i = 0
  while (i < arr) {
    val elem = x.productElement(i)
    code = code * 41 + (if (elem == null) 0 else elem.hashCode())
    i += 1
  }
  code
}

而且,在此示例中,等式模式匹配的第一种情况是:

case that: Foo => this.a == that.a && this.b == that.b

答案 2

推荐