hashCode e é igual a Collections.unmodifiableCollection ()

A class Collections possui vários methods auxiliares estáticos para fornecer exibições somente leitura de vários tipos de coleção, como unmodifiableSet() , unmodifiableList() etc. Para esses objects de exibição, os methods hashCode() e equals() encaminham chamadas para a coleção subjacente … Com uma exceção ímpar: unmodifiableCollection() .

O JavaDoc afirma explicitamente :

A coleção retornada não passa as operações hashCode e equals para a coleção de backup, mas depende dos methods equals e hashCode Object . Isso é necessário para preservar os contratos dessas operações, no caso de a coleção de backup ser um conjunto ou uma lista.

Minha pergunta: wtf isso está falando? Se a coleção de apoio for um conjunto ou uma lista, esperaria comportamento consistente com unmodifiableSet() e unmodifiableList() . Como isso violaria os contratos hashCode / equal?

Do JavaDoc para Coleção:

O contrato geral para o método Object.equals afirma que os iguais devem ser simétricos (em outras palavras, a.equals (b) se e somente se b.equals (a)). Os contratos para List.equals e Set.equals determinam que as listas são iguais a outras listas e são definidas para outros conjuntos. Portanto, um método de igual personalizado para uma class de coleção que implementa nem a interface List nem a interface Set deve retornar false quando essa coleção é comparada a qualquer lista ou conjunto. (Pela mesma lógica, não é possível escrever uma class que implemente corretamente as interfaces Set e List.)

Uma UnmodifiableList é uma UnmodifiableCollection , mas o mesmo não é verdadeiro ao contrário – uma UnmodifiableCollection que encapsula uma List não é uma List não UnmodifiableList . Portanto, se você comparar uma UnmodifiableCollection que encapsula uma List a com uma UnmodifiableList que envolve a mesma List a , os dois wrappers não devem ser iguais. Se você acabou de passar para a lista fechada, eles seriam iguais.