Как говорил мой профессор, только код говорит правду!Так что просто взгляните на код, сгенерированный для:
case class A(i: Int, s: String)
Мы можем дать указание компилятору Scala показать нам сгенерированный код после различных этапов, здесь после проверки типов:
% scalac -Xprint:typer test.scala
[[syntax trees at end of typer]]// Scala source: test.scala
package <empty> {
@serializable case class A extends java.lang.Object with ScalaObject with Product {
..
override def hashCode(): Int = ScalaRunTime.this._hashCode(A.this);
...
override def equals(x$1: Any): Boolean = A.this.eq(x$1).||(x$1 match {
case (i: Int,s: String)A((i$1 @ _), (s$1 @ _)) if i$1.==(i).&&(s$1.==(s)) => x$1.asInstanceOf[A].canEqual(A.this)
case _ => false
});
override def canEqual(x$1: Any): Boolean = x$1.$isInstanceOf[A]()
};
}
Таким образом, вы можете видеть, что вычисление хеш-кода делегировано ScalaRunTime._hashCode , и равенство зависит от равенства членов класса case.