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

Groovy使用equals()和==对GStringImpl的不同结果

发布时间:2020-12-14 16:39:18 所属栏目:大数据 来源:网络整理
导读:根据 groovy docs,==只是一个“聪明”equals(),因为它也照顾避免NullPointerException。因此,如果对象不为null,==和equals()应该返回相同的值。但是,我在执行以下脚本时得到意外的结果: println "${'test'}" == 'test'println "${'test'}".equals('tes
根据 groovy docs,==只是一个“聪明”equals(),因为它也照顾避免NullPointerException。因此,如果对象不为null,==和equals()应该返回相同的值。但是,我在执行以下脚本时得到意外的结果:

println "${'test'}" == 'test'
println "${'test'}".equals('test')

我得到的输出是

true
false

一个例子可以找到here。

这是一个已知的错误相关的GStringImpl或我缺少的东西?

解决方法

好的问题,上面的代码令人惊讶的事情是

println "${'test'}".equals('test')

返回false。另一行代码返回预期结果,所以让我们忘记。

概要

"${'test'}".equals('test')

调用on的对象的类型为GStringImpl,而’test’的类型为String,因此它们不被视为相等。

但为什么?

显然,equals的GStringImpl实现可以被写成这样,当它传递一个包含与此相同字符的字符串时,它返回true。初步看来,这似乎是一个合理的事情要做。

我猜,它不是这样写的原因是因为它会违反等号合同,其中规定:

It is symmetric: for any non-null reference values x and y,x.equals(y) should return true if and only if y.equals(x) returns true.

String.equals(Object other)的实现将在传递GSStringImpl时总是返回false,因此如果GStringImpl.equals(Object other)传递任何String时返回true,那么它将违反对称需求。

(编辑:李大同)

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

    推荐文章
      热点阅读