hashCode и равно для Collections.unmodifiableCollection ()

Collections В классе есть несколько статических вспомогательных методов для предоставления представлений только для чтения различных типов коллекций, таких как,unmodifiableSet()unmodifiableList()и т. д. Для этих объектов просмотраhashCode() а такжеequals() методы перенаправляют вызовы в базовую коллекцию ... с одним странным исключением:.unmodifiableCollection()

JavaDocпрямо заявляет:

Возвращенная коллекция делаетне передать hashCode и equals операции в резервную коллекцию, но полагается наObjectequals а такжеhashCode методы. Это необходимо для сохранения контрактов этих операций в случае, если резервная коллекция представляет собой набор или список.

Мой вопрос: о чем это говорит ?? Если резервная коллекция представляет собой набор или список, ябуду ожидать, что поведение будет соответствоватьunmodifiableSet() а такжеunmodifiableList(), Как это нарушит контракты hashCode / equals?

Ответы на вопрос(1)

Общий контракт для метода 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, две обертки не должны быть равными. Если бы вы только что прошли через завернутый список, они были бы равны.

Ваш ответ на вопрос