Часто возникают ситуации, когда работая с 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.
Добавить комментарий