Оператор Groovy ==

До сих пор я понимал, что == является перегрузкой оператора для .equals(). Однако недавно я обнаружил, что

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

тогда

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

так что, полагаю, == не является сокращением для .equals(), так как оно определяет равенство?

Ответы

Ответ 1

== в Groovy примерно эквивалентен equals(), однако вы будете отличаться от Java при сравнении разных классов с одним и тем же значением - если класс Comparable. Groovy тоже тип литье если возможно.

Если вы посмотрите код, это выглядит как compareToWithEqualityCheck() для ==.

Ответ 2

Оказывается, == не передает на equals(), он делегирует compareTo. Поэтому == вернет true, если a.compareTo(b) возвращает 0

Итак, в этом конкретном случае

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

поэтому:

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

но это не обязательно означает, что

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

Причина, по которой все это настолько странно и запутанно, состоит в том, что договор сравнения Comparable не требует, чтобы он соответствовал равным, хотя это настоятельно рекомендуется.

Настоятельно рекомендуется (хотя и не обязательно), чтобы естественные порядки соответствовали равенствам. Это связано с тем, что сортированные наборы (и отсортированные карты) без явных компараторов ведут себя "странно", когда они используются с элементами (или ключами), естественное упорядочение которых несовместимо с равными.