Ну, в первую очередь, Вы тратите впустую память с новым 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>
, если Вы будете. Таким образом нет никакой гарантии что, когда Вы получаете свой боб, что он может быть представлен как HashMap<String, String>
, потому что Вы могли иметь HashMap<Date, Calendar>
, потому что неуниверсальное представление, которое возвращается, может иметь любые объекты.
, Если код компилирует, и можно выполниться String value = map.get("thisString");
без любых ошибок, не волнуйтесь об этом предупреждении. Но если карта не будет иметь полностью строковых ключей для строкового представления значений, Вы доберетесь ClassCastException
во времени выполнения, потому что дженерики не могут заблокировать это от случая в этом случае.
Проблема состоит в том, что бросок является проверкой на этапе выполнения - но должный ввести стирание, во времени выполнения нет на самом деле никакого различия между HashMap<String,String>
и HashMap<Foo,Bar>
ни для какого другого Foo
и Bar
.
Использование @SuppressWarnings("unchecked")
и содержат Ваш нос. О, и кампания за овеществленные дженерики в Java:)
Предупреждение - просто это. Предупреждение. Иногда предупреждения не важны, иногда они не. Они используются для вызова внимания к чему-то, что компилятор думает, мог быть проблема, но может не быть.
В случае бросков, это всегда собирается дать предупреждение в этом случае. Если Вы абсолютно уверены, что конкретный бросок будет безопасен, то необходимо рассмотреть добавление аннотации как это (я не уверен в синтаксисе) незадолго до строки:
@SuppressWarnings (value="unchecked")
Вы получаете это сообщение, потому что getBean возвращает Ссылку на объект, и Вы бросаете его к корректному типу. Java 1.5 дает Вам предупреждение. Это - природа использования Java 1.5 или лучше с кодом, который работает как это. Spring имеет безопасную с точки зрения типов версию
someMap=getApplicationContext().getBean<HashMap<String, String>>("someMap");
в своем списке ожидающих выполнения задач.