【问题标题】:Groovy == operatorGroovy == 运算符
【发布时间】:2012-12-03 16:06:34
【问题描述】:

到目前为止,我的理解是==.equals() 的运算符重载。然而,我最近发现

new Integer(1) == new Long(1) // returns true

new Integer(1).equals(new Long(1)) // returns false

所以我猜== 不完全是.equals() 的简写,那么它是如何确定相等的呢?

【问题讨论】:

  • 在使用具有长数据库 ID 的 GORM 时,这继续困扰着我。来自 JSON 的请求生成的整数值产生如下行为:groovy:000> m = [1L : 'foo'] ===> [1:foo] groovy:000> m.containsKey(1L) ===> true groovy:000 > m.containsKey(1) ===> 错误

标签: groovy


【解决方案1】:

Groovy 中的== 大致相当于equals(),但是,当比较具有相同值的不同类时,您会发现它与Java 不同——如果类是Comparable。如果可能,Groovy 还会进行类型转换。

如果您查看代码,看起来最终compareToWithEqualityCheck() 是为== 执行的。

【讨论】:

    【解决方案2】:

    原来== 没有委托给equals(),它委托给compareTo。因此,如果a.compareTo(b) 返回 0,== 将返回 true

    所以在这种特殊情况下

    new Integer(1).compareTo(new Long(1)) == 0
    

    因此:

    new Integer(1) == new Long(1)
    

    但这并不一定意味着

    new Integer(1).equals(new Long(1))
    

    这一切之所以如此奇怪和令人困惑,是因为contract of Comparable 并不要求它与equals 一致,尽管强烈建议这样做。

    强烈建议(尽管不是必需的)自然排序与 equals 一致。之所以如此,是因为没有显式比较器的有序集合(和有序映射)在与自然顺序与等于不一致的元素(或键)一起使用时表现“奇怪”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-25
      • 2017-01-18
      • 2012-03-13
      • 2017-10-29
      • 1970-01-01
      • 1970-01-01
      • 2011-01-05
      相关资源
      最近更新 更多