Как исправить «Выражение типа List требует непроверенного преобразования …»?

В fragmentе Java:

SyndFeedInput fr = new SyndFeedInput(); SyndFeed sf = fr.build(new XmlReader(myInputStream)); List entries = sf.getEntries(); 

последняя строка генерирует предупреждение

«Выражение типа List требует необработанного преобразования для соответствия List

Каков подходящий способ исправить это?

Поскольку getEntries возвращает необработанный List , он может содержать что угодно.

Подход без предупреждения – это создать новый List , а затем List каждый элемент результата sf.getEntries() в SyndEntry прежде чем добавлять его в новый список. Collections.checkedList не выполняет эту проверку для вас, хотя было бы возможно реализовать ее для этого.

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

Это обычная проблема при работе с API до Java 5. Чтобы автоматизировать решение от erickson , вы можете создать следующий общий метод:

 public static  List castList(Class 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(); 
  • Предупреждение ReSharper - доступ к модифицированному закрытию
  • предупреждение: небезопасный доступ к миру dir / usr / local / bin в PATH, режим 040777
  • Флаги для включения подробных и подробных предупреждений g ++
  • Виртуальный вызов участника в конструкторе
  • Почему плохо использовать переменную итерации в выражении lambda
  • Разрешение LNK4098: defaultlib 'MSVCRT' конфликтует с
  • Msgstr "разглаживающий тип-караульный указатель нарушит правила строгого сглаживания"
  • Есть ли способ игнорировать одно предупреждение FindBugs?
  • Предупреждение libpng: iCCP: известный неправильный профиль sRGB
  • Как подавлять предупреждения в глобальном масштабе в R Script
  • Как найти, какие обещания необработаны в Node.js UnhandledPromiseRejectionWarning?
  • Давайте будем гением компьютера.