Я новичок в Скале. В 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-обсуждение было проведено последнее обсуждение: 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)
Такое поведение ожидается для equals, так как компилятор Scala переопределяет метод equals для case-классов.
Однако я не уверен, почему хэш-код отличается в Scala 2.7.7. Ваш пример приводит (true, true) к использованию Scala 2.8.