gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 05:59:10 25 4
gpt4 key购买 nike

根据Groovy docs== 只是一个“聪明的”equals(),因为它还负责避免 NullPointerException:

Java’s == is actually Groovy’s is() method, and Groovy’s == is a clever equals()!

[...]

But to do the usual equals() comparison, you should prefer Groovy’s ==, as it also takes care of avoiding NullPointerException, independently of whether the left or right is null or not.

因此,如果对象不为 null,则 ==equals() 应返回相同的值。但是,执行以下脚本时我得到了意想不到的结果:

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

我得到的输出是:

true
false

这是与 GStringImpl 相关的已知错误还是我遗漏的内容?

最佳答案

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

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

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

摘要

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

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

但是为什么呢?

显然,equalsGStringImpl 实现可以这样编写,以便在传递一个包含与 相同字符的 String 时>this,它返回 true。表面上看,这似乎是一件合理的事情。

我猜之所以没有这样写,是因为它违反了 equals 契约,该契约规定:

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.

当传递 GSStringImpl 时,String.equals(Object other) 的实现将始终返回 false,因此如果 GStringImpl.equals(Object other)当传递任何String时,code>返回true,这将违反对称要求。

关于在 GStringImpl 上使用 equals() 和 == 的 Groovy 不同结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9682206/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com