Что является следствием игнорирования предупреждения: непроверенное преобразование в Java - PullRequest
0 голосов
/ 29 октября 2018

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

List list = new ArrayList();           
List<Integer> iList = list;     // warning: unchecked conversion

Ответы [ 3 ]

0 голосов
/ 29 октября 2018

Вы получаете ClassCastException во время выполнения. Приведения, сгенерированные компилятором, могут завершиться ошибкой во время выполнения. Это нарушит основную гарантию, предоставляемую универсальной системой типов. Буквально ваш код небезопасен. Проверьте это.

List list = new ArrayList();           
List<Integer> iList = list;
list.add("wrong");
for (Integer integer : iList) {
    System.out.println(integer);
}

Вот ошибка, которую вы получаете во время выполнения.

java.lang.String нельзя привести к java.lang.Integer

0 голосов
/ 29 октября 2018

(Единственное) последствие выполнения - сбой кода из-за ClassCastException, прямо или косвенно 1 .

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

Хотя игнорирование этих предупреждений - плохая идея, их неправильное подавление может быть хуже.

что вы имеете в виду, подавляя их неправильно?

Я имею в виду добавление аннотации @SuppressWarning для предупреждения, которое фактически приведет к исключению времени выполнения или другой (реальной) проблеме. Добавление аннотации @SuppressWarning просто для того, чтобы компилятор "замолчал", является опасной привычкой.


1 - Например, если вы поймали и неправильно раздавили a ClassCastException!

0 голосов
/ 29 октября 2018

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

Например, следующее пройдет компиляцию (с предупреждением) и выдаст ClassCastException во время выполнения:

List list = new ArrayList();    
list.add("something");       
List<Integer> iList = list;
Integer i = iList.get(0);
...