Scala 2.9中的案例类和代理行为

时间:2011-07-12 16:27:01

标签: scala scala-2.8 case-class scala-2.9

在将我们的代码迁移到Scala 2.9时,我们发现大量的代码无效并且无声地失败。我们将其跟踪到扩展代理不相等的案例类。在我们的代码中,我们不直接扩展Proxy,我们只是在扩展Proxy的库中扩展类。

非常感谢任何帮助。

在2.8

scala> case class Test(a:String) extends Proxy {
     |   def self = a
     | }
defined class Test

scala> 

scala> val label = new Test("bla")
label: Test = bla

scala> println(label == label) // this is TRUE
true

scala> println(label == "bla")
true

在2.9

scala> case class Test(a:String) extends Proxy {
     |   def self = a
     | }
defined class Test

scala> 

scala> val label = new Test("bla")
label: Test = bla

scala> println(label == label) // this is now FALSE
false

scala> println(label == "bla")
true

更新

我认为这只是Scala 2.9中的一个错误。否则,如果你有一个扩展任何其他类的case类,你必须调查该基类的层次结构,以确保它不会扩展Proxy。我们无法在代码中执行此操作,我们只能修复更明显的错误。如果这是预期的行为,那么编译器警告是必须的。听起来不错吗?

更新

还在scala mailing list上进行了讨论。

更新

我已经提交了bug

3 个答案:

答案 0 :(得分:6)

在2.9中他们改变了equals方法:

override def equals(that: Any): Boolean = 
  if(that == null) false 
  else that equals self

override def equals(that: Any): Boolean = that match {
 case null       => false
 case x: Equals  => (x canEqual self) && (x equals self)
 case x          => (x equals self)
}

x:由于某种原因,等于不等于自我。

您可以覆盖equals方法来修复它。

答案 1 :(得分:1)

这将解决您的问题

case class Test(a: String) extends Proxy {
   def self = a
   def canEqual(that: Any) = that match {
      case that: String => true
      case _ => false
   }
}

答案 2 :(得分:0)

那你为什么不覆盖equals方法呢?这应该可以解决问题。