Что неконтролируемо бросок и как я проверяю его?

Я думаю, что получаю то, что сняло флажок со средствами броска (бросающий от одного до другого из другого типа), но что означает "Проверить" бросок? Как я могу проверить бросок так, чтобы я мог избежать этого предупреждения в Eclipse?

31
задан Whymarrh 2 May 2017 в 02:35
поделиться

2 ответа

Непроверенное приведение означает, что вы (неявно или явно) приведение универсального типа к неквалифицированному или наоборот. Например. эта строка

Set<String> set = new HashSet();

выдаст такое предупреждение.

Обычно для таких предупреждений есть веская причина, поэтому вам следует попытаться улучшить свой код вместо того, чтобы подавлять предупреждение. Цитата из Effective Java, 2nd Edition:

Удалите все непроверенные предупреждения, которые вы можете. Если вы удалите все предупреждения, вы будете уверены, что ваш код является типизированным, что очень хорошо. Это означает, что вы не получите исключение ClassCastException во время выполнения, а повысите вашу уверенность в том, что ваша программа работает так, как вы планировали.

Если вы не можете устранить предупреждение и можете доказать, что код, который вызвал предупреждение, является типизированным, то (и только тогда) подавите предупреждение с помощью @SuppressWarnings ("unchecked") аннотация. Если вы подавляете предупреждения , не доказав предварительно, что код является типизированным, вы создаете только ложное чувство безопасности.Код может компилироваться без выдачи предупреждений, но он все равно может генерировать исключение ClassCastException во время выполнения. Однако если вы проигнорируете снятые предупреждения, которые, как вы знаете, безопасны (вместо их подавления), вы не заметите, когда появится новое предупреждение, которое представляет реальную проблему. Новое предупреждение затеряется среди всех ложных срабатываний, которые вы не отключили.

Конечно, не всегда так просто устранить предупреждения, как в приведенном выше коде. Однако, не видя вашего кода, невозможно сказать, как сделать его безопасным.

34
ответ дан 27 November 2019 в 21:49
поделиться

Чтобы подробнее рассказать о том, что написал Питер:

Преобразование неуниверсальных типов в универсальные типы может отлично работать во время выполнения, потому что общие параметры являются стирается во время компиляции, так что у нас остается законный состав. Однако код может завершиться ошибкой позже с неожиданным ClassCastException из-за неправильного предположения относительно параметра типа. Например:

List l1 = new ArrayList();
l1.add(33);
ArrayList<String> l2 = (ArrayList<String>) l1;
String s = l2.get(0);

Непроверенное предупреждение в строке 3 указывает, что компилятор больше не может гарантировать безопасность типов в том смысле, что неожиданное исключение ClassCastException может возникнуть позже. И это происходит в строке 4, которая выполняет неявное приведение.

43
ответ дан 27 November 2019 в 21:49
поделиться
Другие вопросы по тегам:

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