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

Java 6: Неподдерживаемые предупреждения @SuppressWarnings ( "rawtypes" )

Я перешел на новую машину с последним компилятором Sun Java и заметил некоторые предупреждения в существующем коде Java 6. Eclipse IDE предложила аннотировать назначение с помощью:

@SuppressWarnings("rawtypes")

Например:

class Foo<T> {
...
}
...
@SuppressWarnings("rawtypes")
Foo foo = new Foo();

Когда я вернулся к машине со старым компилятором (JDK 1.6.0_20), я заметил, что этот старый компилятор теперь предупреждает о подавлении предупреждений "rawtypes", утверждая, что это подавление не поддерживается и предлагает заменить его с @SuppressWarnings ( "unchecked" ). Кроме того, были некоторые места, которые, по умолчанию, самый новый компилятор заставили меня поместить как "непроверенные", так и "rawtypes" - компиляция этого кода со старым компилятором воспроизводит то же предупреждение.

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

4b9b3361

Ответ 1

Вы можете использовать @SuppressWarnings("unchecked"), который поддерживается как компилятором eclipse, так и javac.

Но помните, что аннотация @SuppressWarnings используется вашим компилятором, который может иметь свои собственные значения. JLS только заставляет компилятор понимать значения "unchecked" и "derecated" (пока).

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

Если вы используете Helios, вам нужно будет установить определенную опцию, чтобы разрешить @SuppressWarnings("unchecked") вместо @SuppressWarnings("rawtypes"),

Если невозможно обновить код новым токеном, системное свойство suppressRawWhenUnchecked=true можно установить при запуске Eclipse.


Ресурсы:


EDIT: вот теперь недоступная статья knol, которая использовалась как ссылка, первоначально написанная Alex Miller.

@SuppressWarnings Аннотации в Java

Стандартная аннотация для подавления различных предупреждений

Аннотации SuppressWarnings были добавлены как стандартная аннотация в Java SE 5.

Определение

Аннотация @SuppressWarnings определена в Спецификации языка Java раздел 9.6.1.5. В этом разделе указано:

Тип аннотации SuppressWarnings поддерживает управление программистами над предупреждениями, иначе выдаваемыми компилятором Java. Он содержит один элемент, который является массивом String. Если объявление программы аннотируется аннотацией @SuppressWarnings(value = {S1, ... , Sk}), тогда компилятор Java не должен сообщать о предупреждении, идентифицированном одним из S1,..., Sk, если это предупреждение было бы создано в результате аннотированной декларации или любого из его частей.

     

Непроверенные предупреждения идентифицируются строкой "unchecked".

В последующем разделе на @Deprecation также упоминается, что эти предупреждения могут быть подавлены с помощью @SuppressWarnings("deprecation").

Допустимые типы предупреждений

Только две строки предупреждения, упомянутые в самой спецификации, являются "непроверенными" и "устаревшими". Тем не менее, Sun JDK использует большой набор строк в компиляторе. Вы можете определить текущий набор, выполнив:

javac -X

который покажет вам (среди прочего) правильные настройки для -Xlint.

Например, Sun JDK 1.5 показывает:

  • all - отключить все предупреждения из этого кода
  • debrecation - запретить использование устаревшего кода
  • unchecked - отключить предупреждения от непроверенного вызова или непроверенного броска
  • fallthrough - подавлять предупреждения, если коммутатор проваливается, не найдя действительный случай (и не по умолчанию)
  • путь -
  • serial - подавлять предупреждения, если класс Serializable не определяет serialVersionUID
  • finally - подавить предупреждения от возврата в конце (который будет игнорировать возврат с попыткой)

И Sun JDK 1.6 добавляет:

  • литая
  • divzero - подавлять предупреждения, если обнаружено целочисленное деление на ноль
  • пустой
  • переопределяет
  • ни один

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

Затмение

Значения Eclipse для Eclipse 3.3 задокументированы в документах JDT.

  • all - запретить все предупреждения
  • бокс - подавление предупреждений относительно операций бокса/распаковки
  • литье - подавление предупреждений относительно операций литья
  • dep-ann - подавлять предупреждения относительно устаревшей аннотации
  • отказ - подавление предупреждений относительно устаревания
  • прохождение - подавление предупреждений относительно отсутствующих разрывов в операторах switch
  • finally - подавить предупреждения относительно блока finally, которые не возвращаются
  • скрытие - подавление предупреждений относительно локалей, которые скрывают переменную
  • incomplete-switch - подавляет предупреждения относительно отсутствующих записей в инструкции switch (перечисление)
  • nls - подавлять предупреждения относительно строковых литералов, отличных от nls
  • null - подавлять предупреждения относительно нулевого анализа
  • ограничение - подавлять предупреждения относительно использования запрещенных или запрещенных ссылок
  • serial - подавлять предупреждения относительно отсутствующего поля serialVersionUID для сериализуемого класса
  • static-access - подавлять предупреждения относительно неправильного статического доступа
  • синтетический доступ - подавлять предупреждения относительно неоптимизированного доступа из внутренних классов
  • unchecked - подавлять предупреждения относительно непроверенных операций
  • unqualified-field-access - подавлять предупреждения относительно доступа к полям неквалифицированные
  • unused - подавлять предупреждения относительно неиспользуемого кода

IntelliJ

NetBeans

Примеры

Пример указания одного предупреждения:

@SuppressWarnings("unchecked")
public void methodWithScaryWarnings() {
    List rawList = new ArrayList();
    List<String> stringList = (List<String>)rawList;
}

Пример использования двух предупреждений:

@SuppressWarnings({"unchecked","deprecation"})
public void methodWithScaryWarnings() {
    callDeprecatedMethod();
}

Ответ 2

Обратите внимание, что Eclipse 3.5 не понимает rawtypes и флаги для предупреждения об отключении. Удручает, что Eclipse придумал аннотацию rawtypes, которая вызывает больше проблем, чем решение. Они должны были просто придерживаться стандартного.