我正在浏览 scala 测试,我不明白为什么编译器在比较“两个新对象”时会产生警告。
这是测试的输出: http://lampsvn.epfl.ch/trac/scala/browser/scala/trunk/test/files/neg/checksensible.check
示例:
checksensible.scala:12: warning: comparing a fresh object using `!=' will always yield true
println(new Exception() != new Exception())
^
如果我编写一个实现
==
方法的类,它也会产生此警告:
class Foo(val bar: Int) {
def ==(other: Foo) : Boolean = this.bar == other.bar
}
new Foo(1) == new Foo(1)
warning: comparing a fresh object using `==' will always yield false
编辑:谢谢oxbow_lakes,我必须重写equals方法,而不是==
class Foo(val bar: Int) {
override def equals(other: Any) : Boolean = other match {
case other: Foo => this.bar == other.bar
case _ => false
}
}
请注意,您不应该 永远不要重写
==
方法(您应该重写 equals
方法)。我假设通过一个 fresh 对象,Scala 意味着一个新对象 without 定义的 equals
方法。
如果您不覆盖
equals
,则 ==
比较是参考比较(即使用 eq
),因此:
new F() == new F()
永远都是假的。