2012-02-15 3 views
1

Я наткнулся на проблему с помощью TObjectDoubleHashMap of trove. Версия 2.0.2 не отменяет метод hashCode.Карты хеша трофея не реализуют hashCode

Более поздние версии trove (3.0.0) включают hashCode.

Обратите внимание, что метод equals переоценивается в обеих версиях.

Почему не был отменен метод hashCode в версии 2? Может быть, контракт на переопределение hashCode/equals был введен после того, как карты тропы были написаны первоначально? Или это просто нарушение контракта и ошибка, которая была исправлена ​​позже? Я был бы очень удивлен, если это ошибка, а не функция, потому как же класс, который в основном имеет дело с хэширования не переопределяют hashCode, когда он имеет equals

ответ

1

Может контракт на переопределение hashCode/equals был введен после того, как Первоначальные карты были написаны?

Нет. Это было в обратном порядке. Я считаю, по крайней мере, уже в 1.1, но я не могу найти ничего раньше, чем 1.3 docs.

Или это просто нарушение контракта и ошибка?

Да. Это является нарушением контракта. Обратите внимание: java.util.Map имеет свой дополнительный договор равенства/хеш-кода выше java.lang.Object, который сознательно нарушен IdentityHashMap и несколькими другими.

От javadoc:

public boolean equals(Object o) 

Сравнивает указанный объект с этой картой для равенства. Возвращает true, если данный объект также является картой, а два Map s представляют одни и те же сопоставления. Более формально две карты t1 и t2 представляют собой одни и те же отображения, если t1.entrySet().equals(t2.entrySet()). Это гарантирует, что метод equals корректно работает в разных реализациях интерфейса Map.