在将我们的代码迁移到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
答案 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方法呢?这应该可以解决问题。