Javaスニペットで:
SyndFeedInput fr = new SyndFeedInput();
SyndFeed sf = fr.build(new XmlReader(myInputStream));
List<SyndEntry> entries = sf.getEntries();
最後の行は警告を生成します
「タイプList
の式は、List<SyndEntry>
に準拠するために未チェックの変換が必要です。」
これを修正する適切な方法は何ですか?
getEntries
は生のList
を返すため、何でも保持できます。
警告なしのアプローチは、新しいList<SyndEntry>
を作成し、sf.getEntries()
結果の各要素をSyndEntry
にキャストしてから、新しいリストに追加します。 Collections.checkedList
はnotを実行しますが、これを実装することは可能ですが、このチェックを行います。
独自のキャストを事前に行うことで、Javaジェネリックの「保証条件に準拠」しています。ClassCastException
が発生すると、ソースコードのキャストに関連付けられます。コンパイラによって挿入された目に見えないキャストではありません。
これは、Java 5以前のAPIを扱う際の一般的な問題です。 エリクソンのソリューション を自動化するには、次の汎用メソッドを作成できます。
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")
注釈をメソッドに追加せずに警告を削除できるとは思わない。
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));
クラスSyndFeed
(クラスcom.Sun.syndication.feed.synd.SyndFeed
を参照していると思います)のjavadocを見ると、メソッドgetEntries()はJava.util.List<SyndEntry>
を返さず、Java.util.List
。
したがって、これには明示的なキャストが必要です。
SyndFeedInput fr = new SyndFeedInput();
SyndFeed sf = fr.build(new XmlReader(myInputStream));
List<?> entries = sf.getEntries();
各sf.getEntries()呼び出しに@SuppressWarning( "unchecked")を配置したくない場合は、リストを返すラッパーをいつでも作成できます。
この他の質問 を参照してください
さらに簡単に
return new ArrayList<?>(getResultOfHibernateCallback(...))