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

标签 java class scala equals hashcode

我有一些 Java 代码要翻译成 Scala。

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

但我不想引入错误,因此我想确保为 equalshashCode 生成的代码与当前实现等效.

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

Third, the compiler adds “natural” implementations of methods toString, hashCode, and equals to your class.

最佳答案

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
});

但是,这并没有告诉您 hashCode 是如何生成的。这是它的来源:

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
}

而且,在这个例子中,equals 模式匹配的第一种情况就是:

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

关于java - 为 case 类的 equals/hashCode 方法生成什么代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4526706/

相关文章:

java - 在 Clojure/Java 中通过自定义协议(protocol)建立 HTTP 隧道

java - RxJavas 单。它的连接方法在哪里?

Java随机数问题。

java - 在 Java 中不使用类创建对象

斯卡拉 :Out of memory during building Breeze

java - 魔方代码循环

java - 如何在java中实现图表和图形?

python - 如何使一个模块可以被其他模块访问

scala - 从参数集合构造案例类

scala - java.lang.NoClassDefFoundError : scala/reflect/ClassManifest