Groovy使用equals()和==对GStringImpl的不同结果
根据
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。初步看来,这似乎是一个合理的事情要做。 我猜,它不是这样写的原因是因为它会违反等号合同,其中规定:
String.equals(Object other)的实现将在传递GSStringImpl时总是返回false,因此如果GStringImpl.equals(Object other)传递任何String时返回true,那么它将违反对称需求。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |