Ну, во-первых, вы тратите память на новый HashMap
вызов создания. Ваша вторая строка полностью игнорирует ссылку на этот созданный hashmap, делая его доступным для сборщика мусора. Итак, не делайте этого, используйте:
private Map<String, String> someMap = (HashMap<String, String>)getApplicationContext().getBean("someMap");
Во-вторых, компилятор жалуется, что вы приводите объект к HashMap
без проверки, является ли он 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>
если хотите. Таким образом, нет никакой гарантии, что когда вы получите свой bean-компонент, он может быть представлен как, HashMap<String, String>
потому что вы можете иметь это, HashMap<Date, Calendar>
потому что возвращаемое неуниверсальное представление может иметь любые объекты.
Если код компилируется, и вы можете выполнить его String value = map.get("thisString");
без ошибок, не беспокойтесь об этом предупреждении. Но если карта не полностью содержит строковые ключи для строковых значений, вы получите ClassCastException
во время выполнения, потому что в этом случае универсальные блоки не могут этого предотвратить.