-1

Чем отличается строка:

HashMap<String,Integer> map = new HashMap<String, Integer>(); 

от

Map<String, Integer> map2 = new HashMap<String, Integer>();

Я понимаю, что класс HashMap расширяет интерфейс Map, но мне интересно именно, почему в одних случаях нужно делать так как в первой строке, а в других так, как во второй. И в каких случаях нужно применять первый способ, а каких второй?

insolor
  • 49,104

2 Answers2

2

Экземпляр HashMap стоит помещать в переменную типа Map, для того чтобы каждый раз при обращении к HashMap-специфичным методам (методам которые определяются в HashMap) вам не приходилось приводить Map переменную к HashMap типу:

(HashMap)myMap.superSpecificHashMapMethod();

P.S. HashMap не расширяет интерфейс Map, а реализует/имлементирует его.

wcobalt
  • 1,182
1

Использование интерфейса в объявлении переменной оправдано, если в ней могут быть использованы разные наследники. Примеры можно встретить в шаблонах проектирования (например, фабричный метод). Также некоторые фреймворки требуют использование интерфейсов в определении переменной. Например, если в сущности Hibernate вы объявите переменную как HashMap, Hibernate ругнется, что не может использовать этот тип. Ведь для вашей коллекции ему необходимо подставить прокси объект (свою реализацию), поэтому нужно использовать Map. Возможно в вашем случае преимущество использования Map вместо HashMap не очевидно, но это хорошая практика и лучше её придерживаться, дабы вошло в привычку.

alex
  • 1,245