Тесты Пообщаться с GPT Протестировать код
Программирование Аналитика Дизайн Маркетинг Управление проектами
29 Ноя 2023
2 мин
131

Причины, по которым метод Map.get(Object key) не полностью является обобщенным в Java

Пройдите тест, узнайте какой профессии подходите

Часто возникают ситуации, когда работая с Map в Java, разработчики сталкиваются с вопросом, почему сигнатура метода get выглядит как V get(Object key), а не V get(K

Часто возникают ситуации, когда работая с Map в Java, разработчики сталкиваются с вопросом, почему сигнатура метода get выглядит как V get(Object key), а не V get(K key).

Для начала, давайте рассмотрим простой пример. Пусть есть карта, где ключом является строка, а значением — число.

Map<String, Integer> map = new HashMap<String, Integer>();
map.put("one", 1);

В таком случае, вызов метода get будет выглядеть следующим образом:

Integer value = map.get("one");

Весьма логично было бы ожидать, что ключ («one») должен быть типа K (в данном случае String), но вместо этого метод принимает Object. Почему так происходит?

Основная причина заключается в обратной совместимости. Когда генерики были введены в Java 5, было важно, чтобы уже существующий код, написанный до введения обобщений, продолжал работать без изменений. Это означает, что следующий код:

Map map = new HashMap();
map.put("one", 1);
Integer value = (Integer) map.get("one");

должен был продолжать работать вместе с новым кодом:

Map<String, Integer> map = new HashMap<String, Integer>();
map.put("one", 1);
Integer value = map.get("one");

Если бы сигнатура метода get была изменена на V get(K key), то старый код перестал бы компилироваться, что нарушало бы обратную совместимость.

Таким образом, несмотря на то, что сначала может показаться странным, что метод get принимает Object вместо K, это необходимо для обеспечения обратной совместимости с кодом, написанным до введения обобщений в Java.

Добавить комментарий