加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

编译器构造 – Scala:比较新鲜对象

发布时间:2020-12-16 09:08:26 所属栏目:安全 来源:网络整理
导读:我正在浏览 scala测试,我不明白为什么编译器在比较“两个新鲜对象”时会产生警告. 这是测试’输出: http://lampsvn.epfl.ch/trac/scala/browser/scala/trunk/test/files/neg/checksensible.check 例: checksensible.scala:12: warning: comparing a fresh
我正在浏览 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方法).我假设通过一个新对象,Scala意味着没有定义的equals方法的新对象.

如果不重写equals,则==比较是参考比较(即使用eq),因此:

new F() == new F()

永远都是假的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读