Ну, по-перше, ви витрачаєте пам'ять за допомогою нового 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
виконання, оскільки генерики не можуть блокувати це в цьому випадку.