Иногда, просматривая код, я вижу, что многие методы указывают аннотацию:
@SuppressWarnings("unchecked")
Что это значит?
Иногда, просматривая код, я вижу, что многие методы указывают аннотацию:
@SuppressWarnings("unchecked")
Что это значит?
Иногда дженерики Java просто не позволяют вам делать то, что вы хотите, и вам нужно эффективно сообщить компилятору, что то, что вы делаете, действительно будет законным во время выполнения.
Я обычно нахожу это болью, когда я издеваюсь над общим интерфейсом, но есть и другие примеры. Это, как правило , стоит попробовать разработать способ избежать предупреждения , а не подавляя её ( Java Дженерики FAQ помогает здесь) , но иногда , даже если это возможно, он изгибается код из формы , так много , что подавляя предупреждение является аккуратнее. Всегда добавляйте пояснительный комментарий в этом случае!
В этом же FAQ часто встречается несколько разделов на эту тему, начиная с «Что такое« непроверенное »предупреждение?» - это стоит прочитать.
(YourClazz<?>)
- Java никогда не предупреждает о таких приведениях, поскольку они безопасны. Однако это не всегда работает (подробности см. В разделе «Общие вопросы»).Это аннотация для подавления предупреждений компиляции о непроверенных общих операциях (не исключениях), таких как приведение типов. По сути, это означает, что программист не хотел получать уведомления о них, о которых он уже знает, при компиляции определенного фрагмента кода.
Вы можете прочитать больше об этой конкретной аннотации здесь:
Кроме того, Oracle предоставляет учебную документацию по использованию аннотаций здесь:
Как они выразились,
источник
Это также может означать, что текущая версия системы типов Java не подходит для вашего случая. Было несколько предложений / хаков JSR, чтобы исправить это: Типовые токены, Супер Типовые токены , Class.cast ().
Если вам действительно нужно это подавление, сузьте его как можно больше (например, не помещайте его в сам класс или в длинный метод). Пример:
источник
SuppressWarning аннотации используются для подавления предупреждений компилятора для аннотированного элемента. В частности,
unchecked
категория позволяет подавлять предупреждения компилятора, генерируемые в результате непроверенных приведений типов.источник
Просто: это предупреждение, с помощью которого компилятор указывает, что он не может обеспечить безопасность типов.
Метод обслуживания JPA, например:
Если бы я не аннотировал здесь @SuppressWarnings («unchecked»), это вызвало бы проблему со строкой, где я хочу вернуть свой ResultList.
Под ярлыком безопасность типов подразумевается: программа считается безопасной по типу, если она компилируется без ошибок и предупреждений и не вызывает никаких неожиданных исключений ClassCastException во время выполнения.
Я использую http://www.angelikalanger.com/GenericsFAQ/FAQSections/Fundamentals.html
источник
В Java дженерики реализованы посредством стирания типов. Например, следующий код.
Составлено к следующему.
И
List.of
определяется как.Который после стирания типа делается.
Компилятор понятия не имеет, что такое универсальные типы во время выполнения, поэтому если вы напишите что-то вроде этого.
Виртуальная машина Java не имеет представления, что такое универсальные типы во время выполнения программы, поэтому она компилируется и запускается, как и для виртуальной машины Java, это приведение к
List
типу (это единственное, что она может проверить, поэтому она проверяет только это).Но теперь добавьте эту строку.
И JVM выдаст неожиданное
ClassCastException
, поскольку компилятор Java вставил неявное приведение.unchecked
Предупреждение говорит программист , что отливка может вызвать программу , чтобы бросить исключение где - то в другом месте. Подавление предупреждения с помощью@SuppressWarnings("unchecked")
указывает компилятору, что программист считает, что код безопасен и не вызовет неожиданных исключений.Почему вы хотите это сделать? Система типов Java недостаточно хороша, чтобы представлять все возможные шаблоны использования типов. Иногда вы можете знать, что приведение является безопасным, но Java не позволяет сказать об этом - можно скрыть подобные предупреждения
@SupressWarnings("unchecked")
, чтобы программист мог сосредоточиться на реальных предупреждениях. Например,Optional.empty()
возвращает синглтон, чтобы избежать выделения пустых опций, которые не хранят значение.Это приведение является безопасным, так как значение, хранящееся в пустом необязательном элементе, не может быть получено, поэтому нет риска непредвиденных исключений приведения класса.
источник
Вы можете подавить предупреждения компилятора и сообщить шаблонам, что написанный вами код является законным в соответствии с ним.
Пример:
источник
Один трюк - создать интерфейс, расширяющий базовый интерфейс ...
Тогда вы можете проверить это с instanceof перед кастом ...
источник
Насколько я знаю, сейчас это связано с подавлением предупреждений о дженериках; дженерики - это новая программная конструкция, не поддерживаемая в версиях JDK, предшествующих JDK 5, поэтому любые сочетания старых конструкций с новыми могут привести к неожиданным результатам.
Компилятор предупреждает об этом программиста, но если программист уже знает, он может отключить эти страшные предупреждения с помощью SuppressWarnings.
источник
Предупреждение, с помощью которого компилятор указывает, что он не может обеспечить безопасность типов. Термин «непроверенное» предупреждение вводит в заблуждение. Это не значит, что предупреждение никак не проверяется. Термин «непроверенный» относится к тому факту, что компилятор и система времени выполнения не имеют достаточно информации о типе, чтобы выполнить все проверки типов, которые были бы необходимы для обеспечения безопасности типов. В этом смысле некоторые операции «не проверяются».
Наиболее распространенным источником «непроверенных» предупреждений является использование необработанных типов. «непроверенные» предупреждения выдаются при доступе к объекту через переменную необработанного типа, поскольку необработанный тип не предоставляет достаточно информации о типе для выполнения всех необходимых проверок типа.
Пример (непроверенного предупреждения в сочетании с необработанными типами):
Когда вызывается метод add, компилятор не знает, безопасно ли добавлять объект String в коллекцию. Если TreeSet является коллекцией, содержащей String s (или ее супертип), то это будет безопасно. Но из информации о типе, предоставленной необработанным типом TreeSet, компилятор не может сказать. Следовательно, вызов потенциально небезопасен, и выдается предупреждение «не проверено».
«непроверенные» предупреждения также сообщаются, когда компилятор находит приведение, целевой тип которого является параметризованным типом или параметром типа.
Пример (непроверенного предупреждения в сочетании с приведением к параметризованному типу или переменной типа):
Приведение, целевой тип которого является параметризованным типом (конкретным или ограниченным подстановочным знаком) или параметром типа, небезопасно, если включена динамическая проверка типа во время выполнения. Во время выполнения доступно только стирание типа, а не точный статический тип, видимый в исходном коде. В результате часть выполнения приведения выполняется на основе стирания типа, а не на точном статическом типе.
В этом примере приведение к Wrapper проверит, является ли объект, возвращаемый из super.clone, оболочкой, а не оболочкой с определенным типом членов. Точно так же приведение к параметру типа T приведено к типу Object во время выполнения и, вероятно, полностью оптимизировано. Из-за стирания типа во время выполнения система не может выполнять более полезные проверки типов во время выполнения.
В некотором смысле, исходный код вводит в заблуждение, потому что он предполагает, что приведение к соответствующему целевому типу выполняется, в то время как на самом деле динамическая часть приведения проверяет только стирание типа целевого типа. Предупреждение «unchecked» выдается, чтобы привлечь внимание программиста к этому несоответствию между статическим и динамическим аспектом приведения.
Пожалуйста, обратитесь: Что такое «непроверенное» предупреждение?
источник
Аннотация @SuppressWarnings является одной из трех встроенных аннотаций, доступных в JDK и добавленных вместе с @Override и @Deprecated в Java 1.5.
@SuppressWarnings указывает компилятору игнорировать или подавлять указанное предупреждение компилятора в аннотированном элементе и все элементы программы внутри этого элемента. Например, если класс аннотирован для подавления определенного предупреждения, то предупреждение, созданное в методе внутри этого класса, также будет разделено.
Возможно, вы видели @SuppressWarnings («непроверенный») и @SuppressWarnings («серийный»), два самых популярных примера аннотации @SuppressWarnings. Прежний используется для подавления предупреждения, генерируемого из-за непроверенного приведения, в то время как более позднее предупреждение используется для напоминания о добавлении SerialVersionUID в класс Serializable.
Подробнее: https://javarevisited.blogspot.com/2015/09/what-is-suppresswarnings-annotation-in-java-unchecked-raw-serial.html#ixzz5rqQaOLUa
источник