#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>
изменяет только одно предупреждение (преобразование из необработанного типа в универсальный) в другое (непроверенное приведение).