문제

나는 스칼라의 새로운 이민자입니다. 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)

내가 무엇을 놓치고 있습니까? 미리 감사드립니다.

도움이 되었습니까?

해결책

사례 클래스 평등 (특히 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)

다른 팁

스칼라 컴파일러가 케이스 클래스의 평등 메소드를 무시하기 때문에이 동작은 동일하게 예상됩니다.

그러나 왜 해시 코드가 Scala 2.7.7에서 다른지 잘 모르겠습니다. 예제는 Scala 2.8을 사용하여 (True, True)를 초래합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top