What code is generated for an equals/hashCode method of a case class?

后端 未结 1 557
南方客
南方客 2020-12-09 03:14

I have some Java code which I\'m translating to Scala.

The code consists of some immutable classes which would fit the purpose of a case class in Scala.

相关标签:
1条回答
  • 2020-12-09 03:41

    Scala has a compiler option -Xprint:typer, which you can use to get the "post-typing source code that it uses internally".

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

    Here you see something like:

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

    But, this doesn't tell you how hashCode is generated. Here's the source for that:

    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
    }
    

    And, in this example, the first case of the equals pattern matching would just be:

    case that: Foo => this.a == that.a && this.b == that.b
    
    0 讨论(0)
提交回复
热议问题