Подтвердить что ты не робот

Что такое снятый контроль и как его проверить?

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

4b9b3361

Ответ 1

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

Set<String> set = new HashSet();

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

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

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

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

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

Ответ 2

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

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

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

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