Ну, во-первых, вы тратите память с новым вызовом создания 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
во время выполнения, потому что в этом случае универсальные блоки не могут этого предотвратить.