"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
.
부터getEntries
raw를 반환하다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.SyndFeed
getEntries() 메서드는 반환되지 않습니다.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
'programing' 카테고리의 다른 글
Java의 3차 연산자는 Java 7 이후 하나의 표현식만 평가합니다. Java 1.6 이하에서는 다른가요? (0) | 2022.09.11 |
---|---|
MariaDB 10.3에서 특정 사용자에 대한 외부 액세스 허용 (0) | 2022.09.11 |
Android JSONObject - 플랫 JSON 객체를 루프하여 각 키와 값을 얻는 방법 (0) | 2022.09.11 |
ES6/2015의 특수 안전 자산 액세스(및 조건부 할당) (0) | 2022.09.11 |
장고 미디어_URL 및 MEDIA_ROOT (0) | 2022.09.11 |