Scala:比较新鲜对象

问题描述 投票:0回答:1

我正在浏览 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
    }
}
scala compiler-warnings
1个回答
14
投票

请注意,您不应该 永远不要重写

==
方法(您应该重写
equals
方法)。我假设通过一个 fresh 对象,Scala 意味着一个新对象 without 定义的
equals
方法。

如果您不覆盖

equals
,则
==
比较是参考比较(即使用
eq
),因此:

new F() == new F()

永远都是假的。

© www.soinside.com 2019 - 2024. All rights reserved.