Исправляем в Java предупреждение о непроверенном преобразовании

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

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

Java
Скопировать код
List<String> myList = new ArrayList<>(); // Теперь у нас список строк!

Если вы не знаете, какой тип данных будет у элементов списка, используйте неопределённые аргументы (wildcards):

Java
Скопировать код
List<?> myMysteryBox = new ArrayList<>(); // Что находится внутри? Об этом знает компилятор!

Назначение параметра типа помогает предотвратить исключения во время выполнения и обеспечивает безопасность типа во время компиляции.

Кинга Идем в IT: пошаговый план для смены профессии

Расшифровываем непроверенное преобразование

При работе со старыми API, созданными до появления обобщений в Java 5, вы часто можете столкнуться с предупреждениями о непроверенном преобразовании, так как такой код возвращает необобщённые списки и не обладает типизацией.

Правильное приведение типов

Если вы не можете изменить старый API, сделайте следующее:

Java
Скопировать код
@SuppressWarnings("unchecked") // Используйте с осторожностью, случится может ClassCastException!
List<SyndEntry> entries = (List<SyndEntry>) sf.getEntries();

Аннотация @SuppressWarnings("unchecked") используется как запасной вариант при возможном ClassCastException.

Улучшение типизации

Если вы можете изменить код и руководствовать его рефакторингом, определите возвращаемый тип:

Java
Скопировать код
public List<SyndEntry> getEntries() { // Теперь метод возвращает обобщенные SyndEntry.
    // ... реализация метода ...
}

В случае работы со старыми API, где невозможно изменить код, Collections.checkedList может быть использован для добавления типа к обёртке:

Java
Скопировать код
List<SyndEntry> safeEntries = Collections.checkedList(sf.getEntries(), SyndEntry.class);
// Типы контролируются во время выполнения, но на этапе компиляции... это не всегда срабатывает.

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

Современный набор инструментов для написания кода

Мощь Guava

Используя библиотеку Guava, можно забыть о проблемах с типами:

Java
Скопировать код
List<SyndEntry> entries = Lists.newArrayList(Iterables.filter(sf.getEntries(), SyndEntry.class));
// SyndEntry? Guava говорит да!

Преимущества неизменяемости

Что насчёт использования неизменяемых списков? Безопасность и предсказуемость кода увеличатся:

Java
Скопировать код
List<SyndEntry> immutableEntries = ImmutableList.copyOf(sf.getEntries());
// С моим списком SyndEntry ничего не произойдёт!

Понимание важности безопасности типов

С появлением обобщений в Java 5, стало возможно избавиться от:

  • Проблем с проверкой типов на этапах выполнения и компиляции.
  • Риска встретиться с ClassCastException.
  • Потери конкретного типа данных из-за стирания типов.

Визуализация

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

Markdown
Скопировать код
До: [Книга📚, Книга📚, Книга📚] // Просто книги. Компилятор в замешательстве.

После упорядочивания и маркировки:
Фэнтези: [🧙‍♂️,🐉,🏰]           // List<FantasyBook>
Научная фантастика: [🚀,🤖,👽]  // List<SciFiBook>
Детективы: [🕵️‍♂️,🔍,👣]     // List<MysteryBook>

`markdown Урок:Маркируйте списки, и компилятор будет спокоен.``

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

Рекомендации по действиям

Когда работаете с обобщениями, помните о следующем:

  • Остерегайтесь преобразования типов: Будьте готовы к потенциальному ClassCastException.
  • Стирание типов: Будьте в курсе, как стирание типов может повлиять на ваш код в рантайме.
  • Проверка типов в рантайме: Используйте Collections.checkedList, когда проверка на этапе компиляции невозможна.
  • Работа со старым кодом: Используйте @SuppressWarnings с осторожностью, предпочтительнее производить рефакторинг, когда это невозможно подавлять.

Полезные материалы

  1. Коллекции (руководство по Java) — Подробное разъяснение работы с коллекциями в Java.
  2. Обобщения (обновленное руководство по Java) — Курс по обобщениям в Java предоставленный Oracle Help Center.
  3. Новые вопросы о стирании типов – Stack Overflow — Обсуждение стирания типов на Stack Overflow.
  4. [Java Generics and Collections [Книга]](https://www.oreilly.com/library/view/java-generics-and/0596527756/) — Детальное изучение обобщений в Java от Мориса Нафталина и Филиппа Вадлера.
  5. Документация JDK 21 — Последние новости о JDK и руководство по работе с предупреждениями о непроверенном преобразовании в Java.
  6. Система типизации – Википедия — Энциклопедический источник информации о системах типизации, включая стирание типов в Java.