hashCode и равно для Collections.unmodifiableCollection()
Collections
В классе есть несколько статических вспомогательных методов, которые предоставляют представления только для чтения различных типов коллекций, таких как unmodifiableSet()
, unmodifiableList()
и т. д. Для этих объектов просмотра hashCode()
а также equals()
методы перенаправляют вызовы в базовую коллекцию... с одним странным исключением: unmodifiableCollection()
,
JavaDoc явно заявляет:
Возвращенная коллекция не передает hashCode и выполняет операции равенства в резервную коллекцию, но полагается на
Object
"sequals
а такжеhashCode
методы. Это необходимо для сохранения контрактов этих операций в случае, если резервная коллекция представляет собой набор или список.
Мой вопрос: о чем это говорит?? Если резервная коллекция представляет собой набор или список, я ожидаю, что поведение будет соответствовать unmodifiableSet()
а также unmodifiableList()
, Как это нарушит контракты hashCode/equals?
1 ответ
Из JavaDoc для коллекции:
Общий контракт для метода Object.equals гласит, что равенства должны быть симметричными (другими словами, a.equals (b) тогда и только тогда, когда b.equals(a)). В контрактах для List.equals и Set.equals говорится, что списки равны только другим спискам, а наборы - другим наборам. Таким образом, пользовательский метод equals для класса коллекции, который не реализует ни интерфейс List, ни Set, должен возвращать false при сравнении этой коллекции с любым списком или набором. (По той же логике невозможно написать класс, который правильно реализует интерфейсы Set и List.)
UnmodifiableList
является UnmodifiableCollection
, но то же самое не верно в обратном порядке - UnmodifiableCollection
это оборачивает List
это не UnmodifiableList
, Так что, если вы сравните UnmodifiableCollection
который оборачивает список a
с UnmodifiableList
который охватывает тот же список a
, две обертки не должны быть равными. Если бы вы только что прошли через завернутый список, они были бы равны.