Как исправить «Выражение типа List требует непроверенного преобразования …»?
В fragmentе Java:
SyndFeedInput fr = new SyndFeedInput(); SyndFeed sf = fr.build(new XmlReader(myInputStream)); List entries = sf.getEntries();
последняя строка генерирует предупреждение
«Выражение типа List
требует необработанного преобразования для соответствия List
”
- Предупреждение: «формат не строковый литерал и аргументы формата»
- Предупреждения памяти iPhone OS. Что означают разные уровни?
- «Примечание: неопределенная переменная», «Примечание: неопределенный индекс» и «Примечание: неопределенное смещение» с использованием PHP
- В Xcode, как подавлять все предупреждения в определенных исходных файлах?
- Предупреждение: обнаружены конфликты между различными версиями одной и той же зависимой сборки
Каков подходящий способ исправить это?
- w3c html ошибка проверки - Раздел не имеет заголовка. Рассмотрите возможность использования элементов h2-h6 для добавления идентифицирующих заголовков ко всем разделам
- Отключить одно предупреждение
- Каков список допустимых имен предупреждений @SuppressWarnings в Java?
- Отключение HtmlUnit Warnings
- Log4j Предупреждение при инициализации?
- Как лучше всего отключить предупреждение о неиспользуемых переменных?
- Игнорировать предупреждения Xcode при использовании Cocoapods
- Как мне адресовать непроверенные предупреждения о броске?
Поскольку getEntries
возвращает необработанный List
, он может содержать что угодно.
Подход без предупреждения – это создать новый List
, а затем List
каждый элемент результата sf.getEntries()
в SyndEntry
прежде чем добавлять его в новый список. Collections.checkedList
не выполняет эту проверку для вас, хотя было бы возможно реализовать ее для этого.
Выполняя свою личную настройку, вы «соблюдаете условия гарантии» Java-дженериков: если ClassCastException
поднят, он будет связан с литой в исходном коде, а не с невидимым литом, вставленным компилятором.
Это обычная проблема при работе с API до Java 5. Чтобы автоматизировать решение от erickson , вы можете создать следующий общий метод:
public static List castList(Class extends T> clazz, Collection> c) { List r = new ArrayList (c.size()); for(Object o: c) r.add(clazz.cast(o)); return r; }
Это позволяет:
List entries = castList(SyndEntry.class, sf.getEntries());
Поскольку это решение проверяет, что элементы действительно имеют правильный тип элемента с помощью броска, он безопасен и не требует SuppressWarnings
.
Похоже, SyndFeed
не использует дженерики.
У вас может быть небезопасный бросок и предупреждение:
@SuppressWarnings("unchecked") List entries = (List ) sf.getEntries();
или вызовите Collections.checkedList – хотя вам все равно придется подавлять предупреждение:
@SuppressWarnings("unchecked") List entries = Collections.checkedList(sf.getEntries(), SyndEntry.class);
Вы пишете SyndFeed
?
sf.getEntries
ли sf.getEntries
список или List
? Я предполагаю, что он возвращает List
и меняет его, чтобы возвращать List
исправляет проблему.
Если SyndFeed
является частью библиотеки, я не думаю, что вы можете удалить предупреждение без добавления @SuppressWarning("unchecked")
к вашему методу.
Если вы используете Guava, и все, что вы хотите сделать, это перебрать ваши значения:
for(SyndEntry entry: Iterables.filter(sf.getEntries(), SyndEntry.class){ ... }
Если вам нужен фактический список, вы можете использовать
List list = Lists.newArrayList( Iterables.filter(sf.getEntries(), SyndEntry.class));
или
List list = ImmutableList.copyOf( Iterables.filter(sf.getEntries(), SyndEntry.class));
Если вы посмотрите на javadoc для classа SyndFeed
(я думаю, вы ссылаетесь на class com.sun.syndication.feed.synd.SyndFeed
), метод getEntries () не возвращает java.util.List
, но возвращает только java.util.List
.
Поэтому для этого вам нужен явный бросок.
Если вы не хотите ставить @SuppressWarning («unchecked») на каждый вызов sf.getEntries (), вы всегда можете сделать оболочку, которая вернет List.
См. Другой вопрос
Еще проще
return new ArrayList>(getResultOfHibernateCallback(...))
SyndFeedInput fr = new SyndFeedInput(); SyndFeed sf = fr.build(new XmlReader(myInputStream)); List> entries = sf.getEntries();