Ну, по-перше, ви витрачаєте пам'ять за допомогою нового HashMapдзвінка про створення. Ваш другий рядок повністю ігнорує посилання на цю створену хеш-карту, роблячи її потім доступною для сміттєзбірника. Отже, не робіть цього, використовуйте:
private Map<String, String> someMap = (HashMap<String, String>)getApplicationContext().getBean("someMap");
По-друге, компілятор скаржиться на те, що ви віддаєте об'єкт на а, HashMapне перевіряючи, чи це a HashMap. Але, навіть якби ви це зробили:
if(getApplicationContext().getBean("someMap") instanceof HashMap) {
private Map<String, String> someMap = (HashMap<String, String>)getApplicationContext().getBean("someMap");
}
Ви, мабуть, все-таки отримаєте це попередження. Проблема в тому, що getBeanповертається Object, тому невідомо, що це за тип. Перетворення його HashMapбезпосередньо не спричинило б проблеми з другим випадком (і, можливо, не буде попередження в першому випадку, я не впевнений, наскільки педантичний компілятор Java з попередженнями для Java 5). Однак ви перетворюєте його на HashMap<String, String>.
HashMaps - це справді карти, які беруть об'єкт як ключ і мають об'єкт як значення, HashMap<Object, Object>якщо ви хочете. Таким чином, немає гарантії, що коли ви отримаєте свою квасолю, вона може бути представлена як а, HashMap<String, String>тому що ви могли мати її, HashMap<Date, Calendar>тому що неповернене представлення, яке повертається, може мати будь-які об'єкти.
Якщо код компілюється і ви можете виконувати String value = map.get("thisString");без будь-яких помилок, не переживайте за це попередження. Але якщо карта не є повністю рядковими клавішами до значень рядків, ви отримаєте час ClassCastExceptionвиконання, оскільки генерики не можуть блокувати це в цьому випадку.