2011-01-13 4 views
8

Можно создать дубликат:
What are the reasons why Map.get(Object key) is not (fully) genericПочему java.util.Map.get (...) не является общим?

Этот метод и ряд других методов в интерфейсе карты не являются общими. Почти везде ключевое значение ожидается как параметр, оно принимает объект вместо этого, а именно remove, get и containsKey.

Любая идея, почему они приняли это решение. Мое предположение заключается в том, что это было сделано для поддержки устаревшего кода, но для меня я считаю, что это слабая позиция.

Может ли кто-нибудь указать мне конкретную причину, почему было бы предпочтительнее принять объект здесь вместо KeyType.

+3

Этот вопрос задан много раз за последние 6 лет. Я предлагаю вам искать существующие ответы –

+0

То же самое с удалением, containsValue, containsKey, ... – aioobe

ответ

8

Объекты, используемые для извлечения/удаления/проверки существования данного ключа, необязательно должны быть того же типа, что и объект, используемый для его хранения (= ключ).

Это должно быть equal и вернуть тот же hashCode в качестве ключа, но ничто в спецификации не говорит о том, что оно должно быть одного типа.

Этот факт используется редко, и большую часть времени вы извлекаете значения с теми же ключами (или, по крайней мере, с объектами того же типа), что и те, которые вы используете для их хранения.

Но поскольку это был поддерживаемый прецедент в «старом» HashMap, его также необходимо поддерживать в версии дженериков.

Обратите внимание, что все методы, которые keySet() использует определенный тип, так как он обязательно возвращает точно объекты, используемые в качестве ключей, когда был вызван put().

+0

А, очень хорошо. Спасибо за ответ. Полагаю, это имеет смысл. Я думаю, вы могли бы искать по Integers сопоставление, которое использует Doubles как ключи ... –

+0

@Kevin: этот конкретный экзамен не будет работать, потому что 'Integer' и' Double' не имеют совместимых 'equals()' реализаций. –

Смежные вопросы