Java 6: предупреждение о неподдерживаемых @SuppressWarnings ("rawtypes") - PullRequest
41 голосов
/ 05 сентября 2010

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

@SuppressWarnings("rawtypes")

Например:

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

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

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

Ответы [ 2 ]

43 голосов
/ 05 сентября 2010

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

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

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

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

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


Ресурсы:


РЕДАКТИРОВАТЬ: вот теперь недоступная статья кнола, которая использовалась в качестве ссылкиПервоначально написанный Алекс Миллер .

@ 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 - подавить все предупреждения из этого кода
  • deprecation - отключить предупреждения от использования устаревшего кода
  • unchecked - подавить предупреждения от неконтролируемого вызова или неконтролируемого приведения
  • fallthrough - подавить предупреждения, если коммутатор проваливается без поиска действительного регистра (и не по умолчанию)
  • path -
  • serial - подавить предупреждения, если класс Serializable не определяет serialVersionUID
  • finally - подавить предупреждения от возврата в рамках finally (которое будет игнорировать возвращение при попытке)

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

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

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

Eclipse

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

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

IntelliJ

1164 * NetBeans * Примеры * +1166 * Пример указания одного предупреждения: @SuppressWarnings("unchecked") public void methodWithScaryWarnings() { List rawList = new ArrayList(); List<String> stringList = (List<String>)rawList; } Пример использования двух предупреждений: @SuppressWarnings({"unchecked","deprecation"}) public void methodWithScaryWarnings() { callDeprecatedMethod(); }

4 голосов
/ 07 февраля 2011

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

...