programing

"Type List 표현식에 선택되지 않은 변환 필요..."를 수정하려면 어떻게 해야 합니까?

prostudy 2022. 9. 11. 16:30
반응형

"Type List 표현식에 선택되지 않은 변환 필요..."를 수정하려면 어떻게 해야 합니까?

Java 스니펫:

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

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

"유형의 표현은List에 준거하기 위해서는 체크되지 않은 변환이 필요합니다.List<SyndEntry>"

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

이는 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.

부터getEntriesraw를 반환하다List뭐든 담을 수 있어요

경고 없는 접근법은 새로운 것을 만드는 것이다.List<SyndEntry>, 그 후, 의 각 요소를 캐스팅 합니다.sf.getEntries()에 귀결되다.SyndEntry새 목록에 추가하기 전에 를 클릭합니다. Collections.checkedList그럼 이 체크는 실행되지 않습니다.다만, 실장은 가능합니다.

직접 캐스트를 실시함으로써 Java 제네릭스의 "보증 조건 준수"를 실현할 수 있습니다.ClassCastException그러면 컴파일러에 의해 삽입된 보이지 않는 캐스트가 아니라 소스 코드의 캐스트와 관련지어집니다.

이 모양은SyndFeed제네릭스를 사용하지 않습니다.

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

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

또는 콜 콜 콜렉션.checked List(체크리스트) - 경고를 억제해야 합니다.

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

당신이 썼나요?SyndFeed?

한다sf.getEntries반환 목록 또는List<SyndEntry>내 추측으로는 그게 돌아오는 것 같아.List다시 되돌리도록 바꿔서List<SyndEntry>문제가 해결됩니다.

한다면SyndFeed라이브러리의 일부입니다.경고를 삭제하려면 , 를 추가합니다.@SuppressWarning("unchecked")주석을 추가합니다.

Guava를 사용하는 경우 값을 반복하기만 하면 됩니다.

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.SyndFeedgetEntries() 메서드는 반환되지 않습니다.java.util.List<SyndEntry>단, 반환되는 것은java.util.List.

그래서 당신은 이것에 대해 명시적인 캐스팅이 필요합니다.

각 sf.getEntries() 호출에 @SuppressWarning("체크 해제")을 붙이지 않으면 언제든지 List를 반환하는 래퍼를 만들 수 있습니다.

다른 질문을 참조하십시오.

한층 더 간단하게

return new ArrayList<?>(getResultOfHibernateCallback(...))

Bruno De Fraine의 대답은 훌륭하다.단, 입력 인수 "Collection"의 사이즈가 맞다면?> c"는 0 입니다.그 후, 늘 포인터로 루틴이 크래쉬 합니다.이를 피하기 위해 약간의 개선을 제안합니다(그리고 HashSet 버전을 제공합니다).

public static <T> HashSet<T> castHashSet(Class<? extends T> clazz, Collection<?> c) {
  int cSize = (c == null) ? 0 : c.size();
  HashSet<T> hashSet = new HashSet<T>(cSize);
  if (c != null) {
    for (Object o : c)
      hashSet.add(clazz.cast(o));
    }
    return hashSet;
}

언급URL : https://stackoverflow.com/questions/367626/how-do-i-fix-the-expression-of-type-list-needs-unchecked-conversion

반응형