Вопрос

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

@SuppressWarnings("rawtypes")

Например:

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

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

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

Это было полезно?

Решение

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

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

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

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

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


Ресурсы :


Редактировать:Вот недоступная сейчас статья knol, которая использовалась в качестве ссылки, первоначально написанная Алекс Миллер.

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

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

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

Определение

Тот Самый @Предупреждения о подавлении аннотация определена в спецификации языка 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 - подавить все предупреждения из этого кода
  • устаревание - подавление предупреждений при использовании устаревшего кода.
  • непроверенный - подавлять предупреждения от непроверенного вызова или непроверенного приведения.
  • fallthrough - подавлять предупреждения, если переключение завершается неудачно, не найдя допустимого варианта (и нет значения по умолчанию).
  • путь -
  • serial - подавляет предупреждения, если сериализуемый класс не определяет serialVersionUID
  • finally - подавлять предупреждения от return в finally (который будет игнорировать return при попытке)

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

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

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

Затмение

Значения предупреждения Eclipse для Eclipse 3.3 следующие задокументировано в документах JDT.

  • все - подавить все предупреждения
  • упаковка - подавление предупреждений относительно операций упаковки / распаковки
  • приведение - подавляет предупреждения, относящиеся к операциям приведения
  • dep-ann - подавлять предупреждения относительно устаревшей аннотации
  • устаревание - подавлять предупреждения, относящиеся к устареванию
  • fallthrough - подавление предупреждений относительно пропущенных разрывов в операторах switch
  • finally - подавлять предупреждения относительно finally block, которые не возвращаются
  • скрытие - подавляет предупреждения относительно локальных файлов, которые скрывают переменную.
  • неполный переключатель - подавление предупреждений относительно отсутствующих записей в инструкции switch (случай перечисления)
  • nls - подавлять предупреждения относительно строковых литералов, отличных от nls
  • null - подавляет предупреждения относительно нулевого анализа.
  • ограничение - подавление предупреждений относительно использования нежелательных или запрещенных ссылок.
  • serial - подавляет предупреждения относительно отсутствия поля serialVersionUID для сериализуемого класса
  • статический доступ - подавление предупреждений о неправильном статическом доступе
  • синтетический доступ - подавление предупреждений относительно неоптимизированного доступа из внутренних классов
  • непроверенный - подавлять предупреждения, относящиеся к непроверенным операциям.
  • неквалифицированный доступ к полю - подавлять предупреждения относительно неквалифицированного доступа к полю
  • неиспользуемый - подавляет предупреждения относительно неиспользуемого кода.

IntelliJ - интеллектуальный

NetBeans - сетевые приложения

Примеры

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

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

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

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top