3

私はScalaの初心者です。2.7.7 では、次のコード

abstract class C
case class CC() extends C

trait T

val c1 = CC()
val c2 = new CC() with T
println(c1.hashCode == c2.hashCode,c1 equals c2)

版画

(false,true)

私が期待していたのに対し

(false,false)

私は何が欠けていますか?前もって感謝します。

4

2 に答える 2

8

ケース クラスの等価性 (特に Scala 2.8) の等価性とハッシュ コードは、タプルおよび/または積の等価性に基づいており、現在はクラスを考慮していません。この問題に関する最近の議論が scala-debate メーリング リスト ( http://old.nabble.com/Possible-Collision-Issue-with-Product.hashCode-td27026790.html ) で行われました。

価値のあるものとして、現在の 2.8 の外観は次のとおりです。

Welcome to Scala version 2.8.0.Beta1-RC6 (Java HotSpot(TM) Client VM, Java 1.6.0_16).
Type in expressions to have them evaluated.
Type :help for more information.

scala> abstract class C
defined class C

scala> case class CC() extends C
defined class CC

scala> trait T
defined trait T

scala> val c1 = CC()
c1: CC = CC()

scala> val c2 = new CC() with T
c2: CC with T = CC()

scala> println(c1.hashCode == c2.hashCode,c1 equals c2)
(true,true)
于 2010-01-11T20:37:12.970 に答える
2

Scala コンパイラはケース クラスの equals メソッドをオーバーライドするため、この動作は equals で想定されています。

ただし、Scala 2.7.7 で hashCode が異なる理由は不明です。あなたの例は、Scala 2.8 を使用して (true, true) になります。

于 2010-01-11T20:35:33.643 に答える