Scala-семантика equals/hashCode для классов case с трейтами

Я новичок в 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)

Что мне не хватает? Заранее спасибо.


person user248348    schedule 11.01.2010    source источник
comment
Это ошибка, и она была исправлена ​​в Scala 2.8.   -  person Daniel C. Sobral    schedule 12.01.2010
comment
Ах, это облегчение. Спасибо всем за ваши ответы.   -  person user248348    schedule 12.01.2010


Ответы (2)


Равенство классов случаев (особенно в 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)
person Kris Nuttycombe    schedule 11.01.2010

Такое поведение ожидается для equals, поскольку компилятор Scala переопределяет метод equals для классов case.

Однако я не уверен, почему hashCode отличается в Scala 2.7.7. Ваш пример приводит (правда, правда) к использованию Scala 2.8.

person Joa Ebert    schedule 11.01.2010