Удалить предупреждения во время компиляции о непроверенных операциях

#java #compiler-warnings

#java #предупреждения компилятора

Вопрос:

Следующая строка вызывает предупреждения во время компиляции:

 ArrayList<Integer> a = (ArrayList) b.clone();
  

создает:

 Note: MyClass.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
  

Как мне удалить предупреждения во время компиляции? -Xlint: none и -nowarn, похоже, не помогают.

Редактировать: на самом деле меня не слишком волнует безопасность типов; в контексте кода я уверен, что типы будут работать. Я просто хочу подавить предупреждения компилятора.

Ответ №1:

Вы можете использовать @SuppressWarnings("unchecked") перед объявлением этой переменной, это должно помочь избавиться от предупреждения.

К сожалению, на самом деле не существует способа выполнить это клонирование безопасным для типов способом, вы должны доверять методу clone, который действительно возвращает только целые числа в новом ArrayList .

Если вам не нужны такие предупреждения компилятора вообще, вы можете добавить -Xlint:-unchecked , чтобы отключить все предупреждения о непроверенных универсальных преобразованиях. Тогда, однако, безопасность типов от дженериков полностью исчезла.

Комментарии:

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

2. -Xlint:-unchecked это не приведет к его полному удалению, оно по-прежнему печатает заметку. На самом деле это ничем не отличается от простого указания того, что -Xlint:unchecked в качестве непроверенного указано «Дать больше подробностей о предупреждениях о непроверенных преобразованиях, которые предписаны спецификацией языка Java». docs.oracle.com/javase/7/docs/technotes/tools/solaris/… Я думаю, что аннотация — это единственный способ заставить ее ничего не показывать.

Ответ №2:

Используйте:

 List<Integer> a = new ArrayList<Integer>(b);
  

Комментарии:

1. На самом деле это лучший способ, если вам нужен только «новый список, содержащий те же элементы» (и у вас нет никаких подклассов ArrayList, которые были бы проигнорированы таким образом).

Ответ №3:

Это потому, что вы преобразуете generic ArrayList в не generic. Вы должны привести его к универсальному ArrayList :

 ArrayList<Integer> a = (ArrayList<Integer>)b.clone();
  

Также, в будущем, попробуйте выполнить компиляцию с -Xlint:unchecked , как говорится в сообщении об ошибке.

Комментарии:

1. Да, я пробовал -Xlint:непроверенный, но я не понял, как это исправить. Спасибо!

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

3. Это все еще использование usafe, не так ли? (Я не могу перепроверить это прямо сейчас).

4. @Puce: Да, добавление <Integer> изменяет только одно предупреждение (преобразование из необработанного типа в универсальный) в другое (непроверенное приведение).