Java 6:Неподдерживаемое предупреждение @SuppressWarnings(“rawtypes”)
-
01-10-2019 - |
Вопрос
Я перешел на новую машину, на которой установлен последний 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.
Ресурсы :
- JLS - @SuppressWarnings()
- Затмение JDT (Компилятор Java, Новый токен "rawtypes" для аннотации @SuppressWarnings)
Редактировать:Вот недоступная сейчас статья 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, которая вызывает больше проблем, чем решение. Они должны были просто застрять со стандартным.