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

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

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

создает:

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

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

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


person chimeracoder    schedule 08.02.2011    source источник


Ответы (3)


Использовать:

List<Integer> a = new ArrayList<Integer>(b);
person Puce    schedule 08.02.2011
comment
На самом деле это лучший способ, если вам нужен только новый список, содержащий те же элементы (и у вас нет подклассов ArrayList, которые таким образом будут игнорироваться). - person Paŭlo Ebermann; 08.02.2011

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

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

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

person Paŭlo Ebermann    schedule 08.02.2011
comment
+1 за предложение аннотации. Гораздо лучше подавить предупреждение в тот момент, когда оно дается, чтобы показать, что вы знаете о потенциальных проблемах. - person SimonC; 08.02.2011
comment
-Xlint:-unchecked не заставит его полностью исчезнуть, он все равно напечатает заметку. На самом деле это ничем не отличается от того, что просто не указывать -Xlint:unchecked как неотмеченное. Дайте больше подробностей для предупреждений о непроверенном преобразовании, которые обязаны спецификацией языка Java. docs.oracle.com/javase/7/ docs/technotes/tools/solaris/ Я думаю, что аннотация — единственный способ ничего не показывать. - person Loren; 21.10.2017

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

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

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

person Community    schedule 08.02.2011
comment
Да, пробовал -Xlint:unchecked, но не понял, как это исправить. Спасибо! - person chimeracoder; 08.02.2011
comment
На самом деле проблема заключается не в приведении универсального ArrayList к неуниверсальному, а наоборот: в присвоении (приведенного) неуниверсального ArrayList универсальной переменной. - person Paŭlo Ebermann; 08.02.2011
comment
Это все еще бесполезный актерский состав, не так ли? (Я не могу перепроверить это прямо сейчас). - person Puce; 08.02.2011
comment
@Puce: Да, добавление <Integer> меняет только одно предупреждение (преобразование необработанного типа в общий тип) на другое (непроверенное приведение). - person Paŭlo Ebermann; 08.02.2011