Безопасность с точки зрения типов: Неконтролируемый бросок

247
задан FabienB 28 July 2011 в 07:34
поделиться

4 ответа

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

240
ответ дан chelmertz 23 November 2019 в 03:00
поделиться

Проблема состоит в том, что бросок является проверкой на этапе выполнения - но должный ввести стирание, во времени выполнения нет на самом деле никакого различия между HashMap<String,String> и HashMap<Foo,Bar> ни для какого другого Foo и Bar.

Использование @SuppressWarnings("unchecked") и содержат Ваш нос. О, и кампания за овеществленные дженерики в Java:)

303
ответ дан Jon Skeet 23 November 2019 в 03:00
поделиться

Предупреждение - просто это. Предупреждение. Иногда предупреждения не важны, иногда они не. Они используются для вызова внимания к чему-то, что компилятор думает, мог быть проблема, но может не быть.

В случае бросков, это всегда собирается дать предупреждение в этом случае. Если Вы абсолютно уверены, что конкретный бросок будет безопасен, то необходимо рассмотреть добавление аннотации как это (я не уверен в синтаксисе) незадолго до строки:

@SuppressWarnings (value="unchecked")
28
ответ дан David M. Karr 23 November 2019 в 03:00
поделиться

Вы получаете это сообщение, потому что getBean возвращает Ссылку на объект, и Вы бросаете его к корректному типу. Java 1.5 дает Вам предупреждение. Это - природа использования Java 1.5 или лучше с кодом, который работает как это. Spring имеет безопасную с точки зрения типов версию

someMap=getApplicationContext().getBean<HashMap<String, String>>("someMap");

в своем списке ожидающих выполнения задач.

9
ответ дан David Nehme 23 November 2019 в 03:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: