Оператор 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 не требует, чтобы он соответствовал равным, хотя это настоятельно рекомендуется.
Настоятельно рекомендуется (хотя и не обязательно), чтобы естественные порядки соответствовали равенствам. Это связано с тем, что сортированные наборы (и отсортированные карты) без явных компараторов ведут себя "странно", когда они используются с элементами (или ключами), естественное упорядочение которых несовместимо с равными.