当前位置: 首页 > 面试题库 >

案例类的equals / hashCode方法生成什么代码?

魏威
2023-03-14
问题内容

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

该代码由一些不可变的类组成,这些类适合case classScala中的目的。

但我不希望引入错误,所以我想,以确保所生成的代码equals,并hashCode为/行为等同于目前的实现。

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

第三,编译器将方法的“自然”实现添加到String,hashCode,并等于您的类。


问题答案:

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
}

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

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


 类似资料:
  • 我已经习惯了从命令行使用XJC工具。但是我意识到我不能使用它生成带有和方法的Java类。我用了这个: 1.可以用CXF XJC Maven插件从DTD文件生成和方法吗?

  • 本文向大家介绍hashCode 与 equals ?为什么重写equals时必须重写hashCode方法?相关面试题,主要包含被问及hashCode 与 equals ?为什么重写equals时必须重写hashCode方法?时的应答技巧和注意事项,需要的朋友参考一下 面试官可能会问你:“你重写过 hashcode 和 equals 么,为什么重写equals时必须重写hashCode方法?” ha

  • 我正在Java开发一个纸牌游戏,我试图比较hashMap中的键和ArrayList中的元素(两者都是对象)。hashCode()和equals()被重写,但出现了一个错误,我不确定它的哪一部分是错误的。 这是纸牌课 我们要做的比较 错误:点击查看错误图片

  • 问题内容: 如果我有 如果我比较A的2个实例但没有覆盖equals方法,是否可以获得预期的结果? 问题答案: 如果我比较A的2个实例但没有覆盖equals方法,是否可以获得预期的结果? 这取决于您的期望:) 默认实现将为您提供 引用相等性-换句话说,当您比较两个引用时,仅当它们是对同一对象的引用时才返回true。 通常,您将重写以实现“值相等”,在这种情况下,两个不同的对象通常被认为具有相等的字段

  • 本文向大家介绍请解释hashCode()和equals()方法有什么联系?相关面试题,主要包含被问及请解释hashCode()和equals()方法有什么联系?时的应答技巧和注意事项,需要的朋友参考一下 考点:基础 Java对象的eqauls方法和hashCode方法是这样规定的: ➀相等(相同)的对象必须具有相等的哈希码(或者散列码)。 ➁如果两个对象的hashCode相同,它们并不一定相同。

  • 下面是关于Spring Boot服务器存根的生成,使用swagger代码(-l Spring)。 Swagger codegen 二进制文件(当前:v2.3.1)是否有任何选项可以在没有hashCode()和equals()方法的情况下生成dto模型? 我在配置帮助中没有找到任何选项。我希望生成的 dto 模型扩展一个抽象类,其中 hashCode() 和 equals() 方法已经声明,因此不应