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

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

JavaDoc явно заявляет:

Возвращенная коллекция не передает hashCode и выполняет операции равенства в резервную коллекцию, но полагается на Object"s equals а также 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, две обертки не должны быть равными. Если бы вы только что прошли через завернутый список, они были бы равны.

Другие вопросы по тегам