Sdscompany.ru

Компьютерный журнал
4 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Suppresswarnings java что это

Что такое SuppressWarnings ( «unchecked» ) в Java?

370 jojo [2009-07-15 09:50:00]

Иногда, просматривая код, я вижу, что многие методы определяют аннотацию:

java generics suppress-warnings unchecked

9 ответов

360 Решение Jon Skeet [2009-07-15 09:54:00]

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

Обычно я нахожу это болью, когда я издеваюсь за общим интерфейсом, но есть и другие примеры. Обычно стоит попытаться выработать способ избежать предупреждения, а не подавлять его (здесь помогает «Что такое» непроверенное «предупреждение?» — это стоит того читать.

43 Ben Lakey [2009-07-15 09:53:00]

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

Подробнее об этом конкретном примечании вы можете прочитать здесь:

Кроме того, Oracle предоставляет некоторую учебную документацию об использовании аннотаций здесь:

Как они выразились,

«Предупреждение» непроверенное «может возникать при взаимодействии с устаревшим кодом, написанным до появления дженериков (обсуждается в уроке под названием Generics).

17 akarnokd [2009-07-15 10:44:00]

Это также может означать, что текущая версия системы типа Java недостаточно хороша для вашего случая. Было несколько предложений JSR/взломало, чтобы исправить это: Введите токены, Super Type Токены, Class.cast().

Если вам действительно нужно это подавление, сушите его как можно больше (например, не кладите его на сам класс или на длинный метод). Пример:

аннотация SuppressWarning используется для подавления предупреждений компилятора для аннотированного элемента. В частности, категория unchecked позволяет подавлять предупреждения компилятора, созданные в результате непроверенных типов.

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

Метод обслуживания JPA, например:

Если бы я не анонсировал @SuppressWarnings ( «unchecked» ) здесь, у него возникла бы проблема с линией, где я хочу вернуть свой ResultList.

В средствах безопасности типа быстрого доступа: программа считается безопасной для типов, если она компилируется без ошибок и предупреждений и не вызывает непредвиденных исключений ClassCastException во время выполнения.

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

Один трюк заключается в создании интерфейса, который расширяет общий базовый интерфейс.

Затем вы можете проверить его с помощью экземпляра перед трансляцией.

В Java генерические средства реализуются с помощью стирания типа. Например, следующий код.

И List.of определяется как.

Которая после стирания типа становится.

Компилятор понятия не имеет, какие типы генерируются во время выполнения, поэтому, если вы пишете что-то вроде этого.

Виртуальная машина Java не имеет представления о том, какие общие типы при запуске программы, поэтому это компилируется и запускается, как и для виртуальной машины Java, это тип приведения в List (это единственное, что он может проверить, поэтому он проверяет только это),

Но теперь добавьте эту строку.

И JVM будет генерировать неожиданное ClassCastException , поскольку Java-компилятор вставил неявный литой.

unchecked предупреждение сообщает программисту, что бросок может заставить программу выкинуть исключение где-то в другом месте. Подавление предупреждения с помощью @SuppressWarnings(«unchecked») сообщает компилятору, что программист считает код безопасным и не вызывает неожиданных исключений.

Почему вы хотите это сделать? Система типа Java недостаточно хороша для представления всех возможных типов использования типов. Иногда вы можете знать, что бросок безопасен, но Java не предоставляет способ сказать это — чтобы скрыть предупреждения, подобные этому, можно использовать @SupressWarnings(«unchecked») , чтобы программист мог сосредоточиться на реальных предупреждениях. Например, Optional.empty() возвращает одноэлемент, чтобы избежать выделения пустых опций, которые не сохраняют значение.

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

Насколько я знаю, на данный момент это связано с подавлением предупреждений о дженериках; generics — это новая конструкция программирования, не поддерживаемая в версиях JDK ранее JDK 5, поэтому любые сочетания старых конструкций с новыми могут создавать неожиданные результаты.

Компилятор предупреждает программиста об этом, но если программист уже знает, они могут отключить эти ужасные предупреждения, используя SuppressWarnings.

Что такое SuppressWarnings («unchecked») в Java?

когда-то при просмотре кода я вижу, что многие методы указывают аннотацию:

9 ответов

иногда Java generics просто не позволяет вам делать то, что вы хотите, и вам нужно эффективно сказать компилятору, что вы действительно делаете будет быть законным во время выполнения.

Я обычно нахожу это боль, когда я издеваюсь над общим интерфейсом,но есть и другие примеры. Обычно стоит попытаться выработать способ избежать предупреждения, а не подавлять его (Java Generics FAQ помогает здесь), но иногда даже если это is возможно, он изгибает код из формы настолько, что подавление предупреждения аккуратнее. Всегда добавляйте пояснительный комментарий в этом случае!

в одном и том же FAQ по дженерикам есть несколько разделов по этой теме, начиная с «что такое» непроверенное » предупреждение?» — это стоит прочитать.

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

вы можете прочитать больше об этой конкретной аннотации здесь:

кроме того, Oracle предоставляет некоторую документацию по использование аннотаций здесь:

как они выразились,

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

это также может означать, что текущая версия системы типов Java недостаточно хороша для вашего случая. Их было несколько!—2—>предложения JSR / hacks, чтобы исправить это: введите токены,Супер Токены Типа, класс.отбрасывать.)(

Если вам действительно нужно это подавление, сузьте его как можно больше (например, не помещайте его в сам класс или в длинный метод). Пример:

на SuppressWarning аннотация используется для подавления предупреждений компилятора для аннотированного элемента. В частности, unchecked категория позволяет подавлять предупреждения компилятора, генерируемые в результате непроверенных приведений типов.

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

метод обслуживания JPA например:

Если бы я не анотировал @SuppressWarnings («unchecked») здесь, у него была бы проблема с line, где я хочу вернуть свой ResultList.

в ярлыке тип-безопасность означает: программа считается типобезопасной, если она компилируется без ошибок и предупреждений и не вызывает никаких неожиданных ClassCastException s на во время выполнения.

вы можете подавить предупреждения компилятора и сказать дженериков, что код, который вы написали является законным в соответствии с ним.

один трюк-создать интерфейс, который расширяет общий базовый интерфейс.

затем вы можете проверить его с помощью instanceof перед приведением.

в Java дженерики реализуются с помощью стирания типа. Например, следующий код.

компилируется следующим образом.

и List.of определяется как.

, которая после стирания типа становится.

компилятор понятия не имеет, что такое универсальные типы во время выполнения, поэтому, если вы напишете что-то вроде этого.

виртуальная машина Java понятия не имеет, какие общие типы при запуске программы, так что это компилируется и запускается, как для виртуальной машины Java, это приведение к List type (это единственное, что он может проверить, поэтому он проверяет только это).

но теперь добавьте эту строку.

и JVM бросит неожиданный ClassCastException , поскольку компилятор Java вставил неявное приведение.

An unchecked предупреждение сообщает программисту, что приведение может привести к тому, что программа выдаст исключение где-то еще. Подавление предупреждение с @SuppressWarnings(«unchecked») сообщает компилятору, что программист считает код безопасным и не вызовет неожиданных исключений.

зачем вы хотите это сделать? Система типов Java недостаточно хороша для представления всех возможных шаблонов использования типов. Иногда вы можете знать, что приведение безопасно, но Java не предоставляет способ сказать это-скрыть предупреждения, подобные этому, @SupressWarnings(«unchecked») может использоваться, чтобы программист мог сосредоточиться на реальных предупреждениях. Например, Optional.empty() возвращает синглтон в избегайте выделения пустых optionals, которые не хранят значение.

Читать еще:  Java system getproperty

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

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

компилятор предупреждает об этом программиста, но если программист уже знает, они могут отключить эти страшные предупреждения с помощью SuppressWarnings.

Suppresswarnings java что это

380060 просмотра

11 ответа

5600 Репутация автора

Иногда, просматривая код, я вижу, что многие методы указывают аннотацию:

Ответы (11)

48 плюса

8465 Репутация автора

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

Вы можете прочитать больше об этой конкретной аннотации здесь:

Кроме того, Oracle предоставляет учебную документацию по использованию аннотаций здесь:

Как они выразились,

«Предупреждение« непроверенное »может появляться при взаимодействии с унаследованным кодом, написанным до появления дженериков (обсуждается в уроке под названием« Обобщения »)».

387 плюса

1114090 Репутация автора

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

Я обычно нахожу это болью, когда я издеваюсь над общим интерфейсом, но есть и другие примеры. Это, как правило , стоит попробовать разработать способ избежать предупреждения , а не подавляя её ( Java Дженерики FAQ помогает здесь) , но иногда , даже если это возможно, он изгибается код из формы , так много , что подавляя предупреждение является аккуратнее. Всегда добавляйте пояснительный комментарий в этом случае!

В этом же FAQ часто встречается несколько разделов на эту тему, начиная с «Что такое« непроверенное »предупреждение?» — это стоит прочитать.

9 плюса

20576 Репутация автора

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

3 плюса

346 Репутация автора

Насколько я знаю, сейчас это связано с подавлением предупреждений о дженериках; дженерики — это новая программная конструкция, не поддерживаемая в версиях JDK, предшествующих JDK 5, поэтому любые сочетания старых конструкций с новыми могут привести к неожиданным результатам.

Компилятор предупреждает об этом программиста, но если программист уже знает, он может отключить эти страшные предупреждения с помощью SuppressWarnings.

19 плюса

52482 Репутация автора

Это также может означать, что текущая версия системы типов Java не подходит для вашего случая. Было несколько предложений / хаков JSR, чтобы исправить это: Типовые токены, Супер Типовые токены , Class.cast ().

Если вам действительно нужно это подавление, сузьте его как можно больше (например, не помещайте его в сам класс или в длинный метод). Пример:

5 плюса

51 Репутация автора

Вы можете подавить предупреждения компилятора и сообщить шаблонам, что написанный вами код является законным в соответствии с ним.

5 плюса

173 Репутация автора

Одна хитрость заключается в создании интерфейса, который расширяет базовый базовый интерфейс .

Тогда вы можете проверить это с instanceof перед кастом .

8 плюса

2344 Репутация автора

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

JPA метод обслуживания, например:

Если бы я не аннотировал здесь @SuppressWarnings («unchecked»), это вызвало бы проблему со строкой, где я хочу вернуть свой ResultList.

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

7 плюса

7616 Репутация автора

В Java дженерики реализованы посредством стирания типов. Например, следующий код.

Составлено к следующему.

И List.of определяется как.

Который после стирания типа делается.

Компилятор понятия не имеет, что такое универсальные типы во время выполнения, поэтому если вы напишите что-то вроде этого.

Виртуальная машина Java не имеет представления, что такое универсальные типы во время выполнения программы, поэтому она компилируется и запускается, как и для виртуальной машины Java, это приведение к List типу (это единственное, что она может проверить, поэтому она проверяет только это).

Но теперь добавьте эту строку.

И JVM выдаст неожиданное ClassCastException , поскольку компилятор Java вставил неявное приведение.

unchecked Предупреждение говорит программист , что отливка может вызвать программу , чтобы бросить исключение где — то в другом месте. Подавление предупреждения с помощью @SuppressWarnings(«unchecked») указывает компилятору, что программист считает, что код безопасен и не вызовет неожиданных исключений.

Почему вы хотите это сделать? Система типов Java недостаточно хороша, чтобы представлять все возможные шаблоны использования типов. Иногда вы можете знать, что приведение является безопасным, но в Java нет способа сказать об этом — @SupressWarnings(«unchecked») можно использовать такие скрытые предупреждения , чтобы программист мог сосредоточиться на реальных предупреждениях. Например, Optional.empty() возвращает синглтон, чтобы избежать выделения пустых опций, которые не хранят значение.

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

1 плюс

2719 Репутация автора

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

Наиболее распространенным источником «непроверенных» предупреждений является использование необработанных типов. «непроверенные» предупреждения выдаются при доступе к объекту через переменную необработанного типа, поскольку необработанный тип не предоставляет достаточно информации о типе для выполнения всех необходимых проверок типа.

Пример (непроверенного предупреждения в сочетании с необработанными типами):

Когда вызывается метод add, компилятор не знает, безопасно ли добавлять объект String в коллекцию. Если TreeSet является коллекцией, содержащей String s (или ее супертип), то это будет безопасно. Но из информации о типе, предоставленной необработанным типом TreeSet, компилятор не может сказать. Следовательно, вызов потенциально небезопасен, и выдается «непроверенное» предупреждение.

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

Пример (непроверенного предупреждения в сочетании с приведением к параметризованному типу или переменной типа):

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

В этом примере приведение к Wrapper проверит, является ли объект, возвращаемый из super.clone, оболочкой, а не оболочкой с определенным типом членов. Аналогично, приведение к параметру типа T приведено к типу Object во время выполнения и, вероятно, полностью оптимизировано. Из-за стирания типа система времени выполнения не может выполнять более полезные проверки типов во время выполнения.

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

плюса

65 Репутация автора

Аннотация @SuppressWarnings является одной из трех встроенных аннотаций, доступных в JDK и добавленных вместе с @Override и @Deprecated в Java 1.5.

@SuppressWarnings указывает компилятору игнорировать или подавлять указанное предупреждение компилятора в аннотированном элементе и все элементы программы внутри этого элемента. Например, если класс аннотирован для подавления определенного предупреждения, то предупреждение, созданное в методе внутри этого класса, также будет разделено.

Читать еще:  Java io inputstream

Возможно, вы видели @SuppressWarnings («непроверенный») и @SuppressWarnings («серийный»), два самых популярных примера аннотации @SuppressWarnings. Прежний используется для подавления предупреждения, генерируемого из-за непроверенного приведения, в то время как последующее предупреждение используется для напоминания о добавлении SerialVersionUID в класс Serializable.

Что такое SuppressWarnings («unchecked») в Java?

Иногда, просматривая код, я вижу, что многие методы задают аннотацию:

Что же это значит?

10 Ответов

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

Обычно я нахожу это болезненным, когда издеваюсь над общим интерфейсом, но есть и другие примеры. Обычно стоит попытаться найти способ избежать предупреждения, а не подавлять его (здесь помогает Java Generics FAQ ), но иногда, даже если это возможно, это настолько искажает код, что подавление предупреждения становится более аккуратным. Всегда добавляйте пояснительный комментарий в этом случае!

В том же generics FAQ есть несколько разделов на эту тему, начиная с «Что такое предупреждение «unchecked»?- . это стоит того, чтобы почитать.

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

Вы можете прочитать больше об этой конкретной аннотации здесь:

Кроме того, Oracle предоставляет некоторую учебную документацию по использованию аннотаций здесь:

Как они выразились,

«Предупреждение ‘unchecked’ может возникать при взаимодействии с унаследованным кодом, написанным до появления дженериков (обсуждается в уроке под названием дженерики).»

Это также может означать, что текущая версия системы типа Java недостаточно хороша для вашего случая. Было несколько JSR предложений / хаков, чтобы исправить это: токены типа, токены Супертипа, Class.cast().

Если вам действительно нужно это подавление, сузьте его как можно больше (например, не ставьте его на сам класс или на длинный метод). Образец:

Аннотация SuppressWarning используется для подавления предупреждений компилятора для аннотируемого элемента. В частности, категория unchecked позволяет подавлять предупреждения компилятора, генерируемые в результате непроверенных приведений типов.

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

JPA сервисный метод, например:

Если бы я не анотировал здесь @SuppressWarnings(«unchecked»), у него была бы проблема с линией, где я хочу вернуть свой ResultList.

В ярлыке type-safety означает: программа считается типобезопасной, если она компилируется без ошибок и предупреждений и не вызывает никаких неожиданных ClassCastException s во время выполнения.

В Java генерики реализуются посредством стирания типов. Например, следующий код.

Компилируется следующим образом.

И List.of определяется как.

Который после стирания типа становится.

Компилятор понятия не имеет, что такое универсальные типы во время выполнения, поэтому если вы пишете что-то вроде этого.

Виртуальная машина Java не имеет представления о том, какие универсальные типы используются при запуске программы, поэтому она компилируется и запускается, а для виртуальной машины Java это приведение к типу List (это единственное, что она может проверить, поэтому она проверяет только это).

Но теперь добавьте эту строку.

И JVM бросит неожиданный ClassCastException , так как компилятор Java вставил неявное приведение.

Предупреждение unchecked говорит программисту, что приведение может привести к тому, что программа выбросит исключение где-то еще. Подавление предупреждения с помощью @SuppressWarnings(«unchecked») говорит компилятору, что программист считает код безопасным и не вызовет неожиданных исключений.

Почему ты хочешь это сделать? Система типов Java недостаточно хороша для представления всех возможных шаблонов использования типов. Иногда вы можете знать, что приведение безопасно, но Java не дает возможности сказать об этом — чтобы скрыть предупреждения, подобные этому, можно использовать @SupressWarnings(«unchecked») , чтобы программист мог сосредоточиться на реальных предупреждениях. Например, Optional.empty() возвращает singleton, чтобы избежать выделения пустых опционов, которые не хранят значение.

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

Один трюк заключается в создании интерфейса, который расширяет общий базовый интерфейс.

Затем вы можете проверить это с помощью instanceof перед приведением.

Вы можете подавить предупреждения компилятора и сказать генераторам, что код, который вы написали, является законным в соответствии с ним.

Насколько я знаю, пока это связано с подавлением предупреждений о дженериках; дженерики — это новая программная конструкция, не поддерживаемая в версиях JDK ранее JDK 5, поэтому любое смешение старых конструкций с новыми может привести к неожиданным результатам.

Компилятор предупреждает об этом программиста, но если программист уже знает, они могут отключить эти страшные предупреждения, используя SuppressWarnings.

Предупреждение, с помощью которого компилятор указывает, что он не может обеспечить безопасность типов. Термин «unchecked» warning вводит в заблуждение. Это не означает, что предупреждение никак не проверяется. Термин «unchecked» относится к тому факту, что компилятор и исполняющая система не имеют достаточной информации о типах для выполнения всех проверок типов, которые были бы необходимы для обеспечения безопасности типов. В этом смысле некоторые операции являются «unchecked». Наиболее распространенным источником предупреждений «unchecked» является использование необработанных типов. «unchecked» предупреждения выдаются при обращении к объекту через переменную необработанного типа, поскольку необработанный тип не предоставляет достаточно информации о типе для выполнения всех необходимых проверок типа.

Пример (непроверенного предупреждения в сочетании с необработанными типами):

TreeSet se t = new TreeSet(); set.add(«abc»); // unchecked warning set.remove(«abc»);

предупреждение: [unchecked] непроверенный вызов для добавления(E) в качестве члена необработанного типа java.util.TreeSet set.add(«abc»);
^ При вызове метода add компилятор не знает, безопасно ли добавлять объект String в коллекцию. Если TreeSet-это коллекция, содержащая строку s (или ее супертип), то это будет безопасно. Но из информации о типе, предоставленной необработанным типом TreeSet, компилятор ничего не может сказать. Следовательно, вызов потенциально небезопасен, и выдается предупреждение «unchecked».

«unchecked» предупреждения также сообщаются, когда компилятор находит приведение, целевой тип которого является параметризованным типом или параметром типа.

Пример (непроверенного предупреждения в сочетании с приведением к параметризованному типу или переменной типа):

class Wrapper < private T wrapped ; public Wrapper (T arg) . p ublic Wrapper clone() < Wrapper clon = null; try <
clon = (Wrapper ) super.clone(); // unchecked warning > catch (CloneNotSupportedException e) <
throw new InternalError();
> try <
Class clzz = this.wrapped.getClass(); Method meth = clzz.getMethod(«clone», new Class[0]); Object dupl = meth.invoke(this.wrapped, new Object[0]); clon.wrapped = (T) dupl; // unchecked warning > catch (Exception e) <> return clon; > >

warning: [unchecked] unchecked cast found : java.lang.Object required: Wrapper clon = ( Wrapper )super.clone();
^ warning: [unchecked] unchecked cast found : java.lang.Object required: T clon. wrapped = (T)dupl;

Приведение, целевой тип которого является параметризованным типом (конкретный или ограниченный подстановочный знак) или параметром типа, небезопасно, если используется динамическая проверка типа во время выполнения. Во время выполнения доступно только стирание типа, а не точный статический тип, который виден в исходном коде. В результате часть выполнения приведения выполняется на основе стирания типа, а не на основе точного статического типа. В этом примере приведение к оболочке будет проверять, является ли объект, возвращаемый из super.clone, оболочкой, а не является ли он оболочкой с определенным типом членов. Аналогично, приведения к параметру типа T приводятся к объекту типа во время выполнения и, вероятно, полностью оптимизируются. Из-за стирания типов система времени выполнения не может выполнять более полезные проверки типов во время выполнения.

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

Похожие вопросы:

Я нашел следующий код в сети. Я запутался в первой строке. Какова цель этой линии ? @SuppressWarnings(unchecked) private void showAlert(String title,String msg,final Class cls) < AlertDialog.

Читать еще:  Параметризованные методы java

У меня есть классы, определенные следующим образом с некоторыми методами в них public abstract class Pojo , U extends Phase> < . public T updatePhase(U.

Когда я читаю исходный код jdk, я нахожу аннотацию, но я не уверен, почему она была использована здесь? что мы можем извлечь из использования @SuppressWarnings(unchecked) в java? когда мы должны его.

Кажется, у меня есть какая-то проблема с подавлением предупреждения, которое я получаю от десериализации ArrayList, содержащего тип MyObject, из файла. Сообщение об ошибке я получаю от линии objects.

Почему Javac игнорирует мою аннотацию @SuppressWarnings в коде ниже? @Override @Transactional(readOnly = true, timeout = 10) public List findAllDue() < Query query =.

Почему альтернативный код(1) компилируется без предупреждений, а альтернативный код (2) выдает предупреждение unchecked cast? Общее для обоих: class Foo < Foo( T [] arg ) < >> Альтернатива.

Netbeans IDE предлагает добавить @SuppressWarnings(unchecked) перед несколькими строками в коде. Я не могу понять, почему. Кто-нибудь, пожалуйста, подскажите, где я ошибаюсь ? private.

Есть ли способ изменить этот код, чтобы я мог удалить непроверенное предупреждение ArrayList keys = new ArrayList (); // do some stuff then // save keys in session.

ITech notes

вторник, 3 июля 2012 г.

@SuppressWarnings: пример

1) Praemonitus praemunitus (предупреждён, значит, вооружён)
Практически все компиляторы в процессе компилирования исходного программного кода выполняют статический анализ этого кода, что позволяет идентифицировать и предупреждать о наличии некоторых общих ошибок программирования. Положительный эффект заключается в том, что каждое имеющееся предупреждение — потенциальная проблема, и чем раньше эта проблема выявляется (в данном случае — уже на этапе компиляции), тем дешевле её решение. В целом, многие опытные разработчики придерживаются мнения, что конечный код не должен вызывать предупреждений компилятора. Более того, в некоторых компаниях идут дальше и настраивают политики систем контроля версий таким образом, чтобы коммиты не вызывали подобных предупреждений.
Однако жизнь такова, что иногда исключения из строгих правил всё-таки возникают. И оказывается, что в каком-то конкретном случае выдаваемое компилятором предупреждение легально, и что было бы здорово указать компилятору проигнорировать конкретное предупреждение. Как вообще можно управлять политикой предупреждений в java ?

2) Опция компилятора -Xlint
Пусть у нас есть следующий метод, в котором имеется потенциальная проблема: использование коллекции без generics .
package by.father.examples.warnings;

import java.util.ArrayList;
import java.util.List;

public class MethodWithUncheckedOperation <

public void someUnusedMethodWithUncheckedOperation () <
List list = new ArrayList();
list.add(«element»);
list.get(0).toString();
>

> Итак, пытаемся компилировать:
E:warnidevexamplessrcmainjavabyfatherexampleswarnings>java -version
java version «1.6.0_33»
Java(TM) SE Runtime Environment (build 1.6.0_33-b03)
Java HotSpot(TM) Client VM (build 20.8-b03, mixed mode, sharing)

E:warnidevexamplessrcmainjavabyfatherexampleswarnings>javac MethodWithUncheckedOperation.java
Note: MethodWithUncheckedOperation.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details. Компиляция прошла без предупреждений, однако нам сделали замечание. Смотрим, что нам предложит компилятор в списке опций:
E:warnidevexamplessrcmainjavabyfatherexampleswarnings>javac -X
-Xlint Enable recommended warnings
-Xlint:rough,-path,-serial,-finally,-overrides,none>Enable or disable specific warnings
.
These options are non-standard and subject to change without notice. Выясняется, что опция -Xlint позволяет включить все рекомендуемые предупреждения, а -Xlint:name — только необходимые (при этом приводится список поддерживаемых компиляторов предупреждений). Попробуем:
E:warnidevexamplessrcmainjavabyfatherexampleswarnings>javac -Xlint:all MethodWithUncheckedOperation.java
MethodWithUncheckedOperation.java:13: warning: [unchecked] unchecked call to add(E) as a member of the raw type java.util.List
list.add(«element»);
^
1 warning

E:warnidevexamplessrcmainjavabyfatherexampleswarnings>javac -Xlint:unchecked MethodWithUncheckedOperation.java
MethodWithUncheckedOperation.java:13: warning: [unchecked] unchecked call to add(E) as a member of the raw type java.util.List
list.add(«element»);
^
1 warning

E:warnidevexamplessrcmainjavabyfatherexampleswarnings>javac -Xlint:none MethodWithUncheckedOperation.java
Note: MethodWithUncheckedOperation.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details. Таким образом,

  • по умолчанию компилятор не выдаёт предупреждения (равноценно применению -Xlint:none или стандартной -nowarn );
  • применение опции -Xlint:name позволяет нам сказать компилятору, нужно ли формировать предупреждения, и какие именно;
  • список доступных параметров -Xlint является «компиляторо-зависимым»; примеры списков предупреждений, доступных для подавления в компиляторах IBM 1.6.0 JDK for Linux x86_64 и Sun 1.6.0_u14 for Linux x86_64 , можно посмотреть тут: Eclipse SuppressWarnings Annotation. В целом, они ничем не отличаются от только что представленного варианта. А вот вывод для компилятора Sun 1.5.0 :

E:warnidevexamplessrcmainjavabyfatherexampleswarnings>»C:Javajdk1.5.0_12binjava.exe» -version
java version «1.5.0_12»
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_12-b04)
Java HotSpot(TM) Client VM (build 1.5.0_12-b04, mixed mode)

E:warnidevexamplessrcmainjavabyfatherexampleswarnings>»C:Javajdk1.5.0_12binjavac.exe» -X
-Xlint Enable recommended warnings
-Xlint:Enable or disable specific warnings

  • следует помнить, что опции с ключом -X объявлены как нестандартные со всеми вытекающими последствиями.

Казалось бы, всё хорошо. Однако с помощью -Xlint:name мы можем управлять целыми типами предупреждений, и не можем выделить отдельные классы, методы, переменные и пр. И тут на помощь приходит аннотация @SupressWarnings .

3) Аннотация @SupressWarnings
Интерфейс: public interface SuppressWarnings
Реализует: интерфейс Annotation
Появился: jdk 1.5
JavaDocs : http://docs.oracle.com/javase/7/docs/api/java/lang/SuppressWarnings.html ( eng ), http://doc.java.sun.com/DocWeb/api/java.lang.SuppressWarnings ( ru )
Параметры: String[] value — множество предупреждений в аннотированном элементе, о которых компилятор умалчивает.
Допускаются дублирующиеся имена. Второе и все последующие упоминания одного и того же имени игнорируются. Наличие неизвестных компилятору имён не является ошибкой: компиляторы должны игнорировать любые имена предупреждений, которые они не могут распознать. Однако, допускается генерация предупреждения, если аннотация содержит неизвестное имя предупреждения. Производители компиляторов должны документировать имена предупреждений, которые они поддерживают с данным типом аннотации. Поощряется сотрудничество для поддержания одинаковых имён среди разнообразных компиляторов.
Примеры: @SuppressWarnings(«unchecked») , @SuppressWarnings(value=»unchecked») , @SuppressWarnings(<"unused", "deprecation">)

Теория.
Аннотация @SupressWarnings указывает на то, что именованное предупреждение ( warning ) компилятора должно быть подавлено в аннотируемом элементе (и во всех содержащихся в нём программных элементах). Множество подавленных предупреждений в данном элементе — это супермножество подавленных предупреждений во всех вложенных элементах. К примеру, если вы аннотируете класс для подавления одного предупреждения и аннотируете метод для подавления другого, то в методе будут подавляться оба предупреждения. Аннотацию всегда следует использовать как можно ближе к той части кода, для которой она необходима — это более эффективно. Так, если требуется подавить предупреждение в специфичном методе, нужно аннотировать скорее этот метод, чем весь класс, который его содержит.

Пример использованного ранее метода с добавленными аннотациями:
@SuppressWarnings(<"unchecked", "unused">)
public void someUnusedMethodWithUncheckedOperation () <
List list = new ArrayList();
list.add(«element»);
list.get(0).toString();
> Таким образом, с помощью аннотации мы можем помечать отдельные классы, методы и переменные, что даёт нам высокую гибкость настройки. Более того, различные IDE расширяют список поддерживаемых предупреждений (соответственно, мы получаем compiler-specific + IDE-specific списки). Например, список параметров для Eclipse можно посмотреть здесь
Eclipse platform help: Excluding warnings using @SuppressWarnings. С IntelliJ IDEA немного сложнее, найти подобный список не получилось; похоже, что в этой IDE он разбросан по мощному инструменту InspectionGadgets .

Давайте рассмотрим подробнее набор предупреждений, поддерживаемых Sun -овским компилятором. Итак, можно подавлять предупреждения, связанные с:

  • all — любые;
  • cast — приведением типов;
  • deprecation ( dep-ann ) — использованием устаревшего кода;
  • divzero — делением на нуль;
  • empty — ? (не совсем понятно, информации не нашёл, возможно, связано с наличием пустых блоков?);
  • unchecked — непроверенными операциями;
  • fallthrough — некорректным использованием оператора switch (например, когда хотя бы в одном из case ‘ов пропущен завершающий break );
  • path — обсутствием заданных директорий (входящих в classpath , sourcepath и т.д.);
  • serial — пропуском поля serialVersionUID для сериализуемого класса;
  • finally — наличием некорректных блоков finally ;
  • overrides — некорректным переопределением (например, переопределён equals() , но не hashCode() ).

Здесь @SuppressWarnings values ( eng ) хороший пост с примерами и пояснениями, а здесь свежая статья List of valid @suppresswarning annotation parameters in Java for Eclipse and IBM RAD IDE ( eng ).

4) Итого
— предупреждения компилятора — хорошая возможность проверить свой код на наличие проблем определённых типов;
— на практике следует добиваться того, чтобы код компилировался без предупреждений;
— однако в некоторых случаях предупреждений не избежать;
— опция компилятора -Xlint позволяет включать/отключать выдачу предупреждений определённых типов;
— появившаяся в java 5 аннотация @SuppressWarning позволяет решать эту же задачу гораздо более гибко;
— нужно помнить, что как опции -Xlint, так и аннотация @SuppressWarning зависят от используемых компилятора и IDE.

Ссылка на основную публикацию
Adblock
detector