Исправляем в Java предупреждение о непроверенном преобразовании
Быстрый ответ
Чтобы избавиться от предупреждения о непроверенном преобразовании, укажите параметрический тип при объявлении списка:
List<String> myList = new ArrayList<>(); // Теперь у нас список строк!
Если вы не знаете, какой тип данных будет у элементов списка, используйте неопределённые аргументы (wildcards):
List<?> myMysteryBox = new ArrayList<>(); // Что находится внутри? Об этом знает компилятор!
Назначение параметра типа помогает предотвратить исключения во время выполнения и обеспечивает безопасность типа во время компиляции.
Расшифровываем непроверенное преобразование
При работе со старыми API, созданными до появления обобщений в Java 5, вы часто можете столкнуться с предупреждениями о непроверенном преобразовании, так как такой код возвращает необобщённые списки и не обладает типизацией.
Правильное приведение типов
Если вы не можете изменить старый API, сделайте следующее:
@SuppressWarnings("unchecked") // Используйте с осторожностью, случится может ClassCastException!
List<SyndEntry> entries = (List<SyndEntry>) sf.getEntries();
Аннотация @SuppressWarnings("unchecked")
используется как запасной вариант при возможном ClassCastException
.
Улучшение типизации
Если вы можете изменить код и руководствовать его рефакторингом, определите возвращаемый тип:
public List<SyndEntry> getEntries() { // Теперь метод возвращает обобщенные SyndEntry.
// ... реализация метода ...
}
В случае работы со старыми API, где невозможно изменить код, Collections.checkedList
может быть использован для добавления типа к обёртке:
List<SyndEntry> safeEntries = Collections.checkedList(sf.getEntries(), SyndEntry.class);
// Типы контролируются во время выполнения, но на этапе компиляции... это не всегда срабатывает.
Помните, что Collections.checkedList
обеспечивает безопасность типа во время выполнения, но не убирает предупреждения компилятора.
Современный набор инструментов для написания кода
Мощь Guava
Используя библиотеку Guava, можно забыть о проблемах с типами:
List<SyndEntry> entries = Lists.newArrayList(Iterables.filter(sf.getEntries(), SyndEntry.class));
// SyndEntry? Guava говорит да!
Преимущества неизменяемости
Что насчёт использования неизменяемых списков? Безопасность и предсказуемость кода увеличатся:
List<SyndEntry> immutableEntries = ImmutableList.copyOf(sf.getEntries());
// С моим списком SyndEntry ничего не произойдёт!
Понимание важности безопасности типов
С появлением обобщений в Java 5, стало возможно избавиться от:
- Проблем с проверкой типов на этапах выполнения и компиляции.
- Риска встретиться с
ClassCastException
. - Потери конкретного типа данных из-за стирания типов.
Визуализация
Представьте себе предупреждение о непроверенном преобразовании как беспорядочно заполненную книжную полку:
До: [Книга📚, Книга📚, Книга📚] // Просто книги. Компилятор в замешательстве.
После упорядочивания и маркировки:
Фэнтези: [🧙♂️,🐉,🏰] // List<FantasyBook>
Научная фантастика: [🚀,🤖,👽] // List<SciFiBook>
Детективы: [🕵️♂️,🔍,👣] // List<MysteryBook>
`markdown
Урок:
Маркируйте списки, и компилятор будет спокоен.``
Так как каждые полки отмечены конкретным жанром, предупреждения о непроверенном преобразовании исчезнут, и компилятор перестанет путаться.
Рекомендации по действиям
Когда работаете с обобщениями, помните о следующем:
- Остерегайтесь преобразования типов: Будьте готовы к потенциальному
ClassCastException
. - Стирание типов: Будьте в курсе, как стирание типов может повлиять на ваш код в рантайме.
- Проверка типов в рантайме: Используйте
Collections.checkedList
, когда проверка на этапе компиляции невозможна. - Работа со старым кодом: Используйте
@SuppressWarnings
с осторожностью, предпочтительнее производить рефакторинг, когда это невозможно подавлять.
Полезные материалы
- Коллекции (руководство по Java) — Подробное разъяснение работы с коллекциями в Java.
- Обобщения (обновленное руководство по Java) — Курс по обобщениям в Java предоставленный Oracle Help Center.
- Новые вопросы о стирании типов – Stack Overflow — Обсуждение стирания типов на Stack Overflow.
- [Java Generics and Collections [Книга]](https://www.oreilly.com/library/view/java-generics-and/0596527756/) — Детальное изучение обобщений в Java от Мориса Нафталина и Филиппа Вадлера.
- Документация JDK 21 — Последние новости о JDK и руководство по работе с предупреждениями о непроверенном преобразовании в Java.
- Система типизации – Википедия — Энциклопедический источник информации о системах типизации, включая стирание типов в Java.