8

在将我们的代码迁移到 Scala 2.9 时,我们发现大量代码不起作用并且默默地失败了。我们将其追踪到扩展 Proxy 不相等的案例类。在我们的代码中,我们不直接扩展 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 中的一个错误。否则,如果您有一个扩展任何其他类的案例类,您必须调查该基类的层次结构,以确保它绝不会扩展代理。我们将无法在我们的代码中执行此操作,我们只能修复更明显的错误。如果这是预期行为,那么编译器警告是必须的。那个听起来是对的吗?

更新

也在scala 邮件列表中讨论。

更新

我提交了一个错误

4

3 回答 3

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 不等于 self。

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

于 2011-07-12T16:54:53.027 回答
1

这将解决您的问题

case class Test(a: String) extends Proxy {
   def self = a
   def canEqual(that: Any) = that match {
      case that: String => true
      case _ => false
   }
}
于 2011-07-12T16:59:15.847 回答
0

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

于 2011-07-12T16:51:50.063 回答