Типы HashMap по умолчанию для K и V - PullRequest
6 голосов
/ 05 ноября 2008

Я обычно печатаю объявления на карте, но выполнял некоторые операции и находил их без ввода Это заставило меня задуматься (о нет!). Какая по умолчанию типизация объявления карты. Учтите следующее:

Map map = new HashMap();
map.put("one", "1st");
map.put("two", new Integer(2));
map.put("three", "3rd");
for ( Map.Entry entry : map.entrySet() ){
  System.out.println(entry.getKey() + " -> " + entry.getValue());
}

это ошибки с несовместимыми типами на Map.Entry. Так что, если я наберу объявление с:

Map<Object,Object> map = new HashMap();

тогда все работает хорошо. Так какой тип по умолчанию устанавливается в объявлении? Или я что-то упускаю?

Ответы [ 3 ]

8 голосов
/ 05 ноября 2008

Тип по умолчанию отсутствует.

Типы в дженериках Java предназначены только для проверки во время компиляции. Они стираются во время выполнения и по существу исчезают.

Думайте о дженериках как о статическом помощнике: а) для лучшего документирования кода и б) для некоторой ограниченной проверки во время компиляции на безопасность типов.

4 голосов
/ 05 ноября 2008

Тип java.lang.Object .

Конструкция для принимает тип Iterable и вызывает его метод iterator . Поскольку Set не набирается с помощью обобщений, итератор возвращает объекты типа Object . Их необходимо явно привести к типу Map.Entry .

Map map = new HashMap();
map.put("one", "1st");
map.put("two", new Integer(2));
map.put("three", "3rd");
for (Object o : map.entrySet()) {
    Map.Entry entry = (Map.Entry) o;
    System.out.println(entry.getKey() + " -> " + entry.getValue());
}
1 голос
/ 05 ноября 2008

HashMap - это коллекция объектов, контейнеров Think C ++. Каждый элемент карты является «корзиной» для хранения данных.
Вы помещаете в блоки разные типы данных, хэш-карта должна знать, что это не все типы данных. Если в хэш-карту будет помещен только один тип данных, вы получите предупреждение, но оно скомпилируется.

...