回答:
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<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));
さらに簡単に
return new ArrayList<?>(getResultOfHibernateCallback(...))