[java] “목록 유형의 표현식에 확인되지 않은 변환이 필요합니다 …”는 어떻게 수정합니까?
자바 스 니펫에서 :
SyndFeedInput fr = new SyndFeedInput();
SyndFeed sf = fr.build(new XmlReader(myInputStream));
List<SyndEntry> entries = sf.getEntries();
마지막 줄은 경고를 생성합니다
“유형의 표현 List
에 적합하도록 선택하지 않은 변환이 필요합니다 List<SyndEntry>
“
이 문제를 해결하는 적절한 방법은 무엇입니까?
답변
getEntries
raw를 반환 하므로 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.getEntries
List 또는 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
.
따라서 명시 적으로 캐스팅해야합니다.