답변:
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);
Collections.checkedList
SyndEntry 이외의 요소를 나중에 추가하지 못하게합니다. 나는 개인적으로 checkedList
많이 사용 하지 않지만 어쨌든 종종이 확인되지 않은 캐스트 상황에 빠지지 않습니다 ...
당신은 작성 했습니까 SyndFeed
?
sf.getEntries
List 또는 List<SyndEntry>
?를 반환 합니까 ? 내 추측은 그것이 돌아 List
오고 그것을 돌려 주기로 바꾸면 List<SyndEntry>
문제가 해결된다는 것입니다.
SyndFeed
라이브러리의 일부인 경우 @SuppressWarning("unchecked")
메소드에 주석을 추가하지 않고 경고를 제거 할 수 없다고 생각합니다 .
SyndFeed
rometools.github.io/rome/ROMEReleases/ROME1.0Release.html 에서 제공됩니다 . 문제는 사람들이에서 발견처럼 로마의 최신 버전에서 수정 될 것으로 보인다 mvnrepository.com/artifact/com.rometools/rome/1.9.0
구아바를 사용하고 있고 원하는 것은 값을 반복하는 것입니다.
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));