[java] “목록 유형의 표현식에 확인되지 않은 변환이 필요합니다 …”는 어떻게 수정합니까?

자바 스 니펫에서 :

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

마지막 줄은 경고를 생성합니다

“유형의 표현 List에 적합하도록 선택하지 않은 변환이 필요합니다 List<SyndEntry>

이 문제를 해결하는 적절한 방법은 무엇입니까?



답변

getEntriesraw를 반환 하므로 List아무 것도 보유 할 수 있습니다.

경고없는 접근 방식은 새로운 List<SyndEntry>을 만든 다음 새로운 목록에 추가 sf.getEntries()하기 SyndEntry전에 결과 의 각 요소를 캐스트 하는 것입니다. 이 검사는 사용자를 위해 수행 Collections.checkedList하지는 않지만 구현하는 것이 가능할 수도 있습니다.

자체 캐스트를 수행하면 Java 제네릭의 “보증 조건을 준수하는 것”입니다. a ClassCastException가 발생하면 컴파일러가 삽입 한 보이지 않는 캐스트가 아니라 소스 코드의 캐스트와 연관됩니다.


답변

Java 5 이전 API를 처리 할 때 발생하는 일반적인 문제입니다. erickson 에서 솔루션 을 자동화하기 위해 다음과 같은 일반적인 방법을 만들 수 있습니다.

public static <T> List<T> castList(Class<? extends T> clazz, Collection<?> c) {
    List<T> r = new ArrayList<T>(c.size());
    for(Object o: c)
      r.add(clazz.cast(o));
    return r;
}

이를 통해 다음을 수행 할 수 있습니다.

List<SyndEntry> entries = castList(SyndEntry.class, sf.getEntries());

이 솔루션은 실제로 캐스트를 통해 요소가 올바른 요소 유형을 가지고 있는지 확인하므로 안전하고 필요하지 않습니다 SuppressWarnings.


답변

SyndFeed제네릭을 사용하지 않는 것 같습니다 .

안전하지 않은 캐스팅과 경고 억제가있을 수 있습니다.

@SuppressWarnings("unchecked")
List<SyndEntry> entries = (List<SyndEntry>) sf.getEntries();

또는 Collections.checkedList를 호출하십시오. 그래도 경고를 표시하지 않아도됩니다.

@SuppressWarnings("unchecked")
List<SyndEntry> entries = Collections.checkedList(sf.getEntries(), SyndEntry.class);


답변

당신은 작성 했습니까 SyndFeed?

sf.getEntriesList 또는 List<SyndEntry>?를 반환 합니까 ? 내 추측은 그것이 돌아 List오고 그것을 돌려 주기로 바꾸면 List<SyndEntry>문제가 해결된다는 것입니다.

SyndFeed라이브러리의 일부인 경우 @SuppressWarning("unchecked")메소드에 주석을 추가하지 않고 경고를 제거 할 수 없다고 생각합니다 .


답변

구아바를 사용하고 있고 원하는 것은 값을 반복하는 것입니다.

for(SyndEntry entry: Iterables.filter(sf.getEntries(), SyndEntry.class){
  ...
}

실제 목록이 필요한 경우 사용할 수 있습니다

List<SyndEntry> list = Lists.newArrayList(
    Iterables.filter(sf.getEntries(), SyndEntry.class));

또는

List<SyndEntry> list = ImmutableList.copyOf(
    Iterables.filter(sf.getEntries(), SyndEntry.class));


답변

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


답변

클래스의 javadoc을 보면 (클래스 SyndFeed를 참조한다고 생각합니다 com.sun.syndication.feed.synd.SyndFeed) getEntries () 메소드는 반환하지 않지만 java.util.List<SyndEntry>just 만 반환합니다 java.util.List.

따라서 명시 적으로 캐스팅해야합니다.