Вопрос-ответ

What is SuppressWarnings ("unchecked") in Java?

Что такое SuppressWarnings ("непроверенный") в Java?

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

@SuppressWarnings("unchecked")

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

Переведено автоматически
Ответ 1

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

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

В том же FAQ по generics есть несколько разделов по этой теме, начинающихся с "Что такое "непроверенное" предупреждение?" - его стоит прочитать.

Ответ 2

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

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


SuppressWarnings


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


Примечания


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


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


Ответ 3

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

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

public List<String> getALegacyListReversed() {
@SuppressWarnings("unchecked") List<String> list =
(List<String>)legacyLibrary.getStringList();

Collections.reverse(list);
return list;
}
Ответ 4

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

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

@SuppressWarnings("unchecked")
public List<User> findAllUsers(){
Query query = entitymanager.createQuery("SELECT u FROM User u");
return (List<User>)query.getResultList();
}

Если бы я не анотировал здесь @SuppressWarnings("непроверенный"), возникла бы проблема со строкой, куда я хочу вернуть свой результирующий список.

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

Я основываюсь на http://www.angelikalanger.com/GenericsFAQ/FAQSections/Fundamentals.html

java generics