web-dev-qa-db-ja.com

「リスト型の式には未チェックの変換が必要です...」を修正するにはどうすればよいですか?

Javaスニペットで:

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

最後の行は警告を生成します

「タイプListの式は、List<SyndEntry>に準拠するために未チェックの変換が必要です。」

これを修正する適切な方法は何ですか?

128
user46277

getEntriesは生のListを返すため、何でも保持できます。

警告なしのアプローチは、新しいList<SyndEntry>を作成し、sf.getEntries()結果の各要素をSyndEntryにキャストしてから、新しいリストに追加します。 Collections.checkedListnotを実行しますが、これを実装することは可能ですが、このチェックを行います。

独自のキャストを事前に行うことで、Javaジェネリックの「保証条件に準拠」しています。ClassCastExceptionが発生すると、ソースコードのキャストに関連付けられます。コンパイラによって挿入された目に見えないキャストではありません。

94
erickson

これは、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を必要としません。

111
Bruno De Fraine

SyndFeedはジェネリックを使用していないようです。

安全でないキャストと警告抑制のいずれかを使用できます。

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

または Collections.checkedList を呼び出します-ただし、警告を抑制する必要があります。

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

SyndFeedと書きましたか?

sf.getEntriesはListまたはList<SyndEntry>を返しますか?私の推測では、それはListを返し、List<SyndEntry>を返すように変更すると問題が解決します。

SyndFeedがライブラリの一部である場合、@SuppressWarning("unchecked")注釈をメソッドに追加せずに警告を削除できるとは思わない。

7
Alex B

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));
2

クラスSyndFeed(クラスcom.Sun.syndication.feed.synd.SyndFeedを参照していると思います)のjavadocを見ると、メソッドgetEntries()はJava.util.List<SyndEntry>を返さず、Java.util.List

したがって、これには明示的なキャストが必要です。

1
Shyam
SyndFeedInput fr = new SyndFeedInput();
SyndFeed sf = fr.build(new XmlReader(myInputStream));
List<?> entries = sf.getEntries();
1
Honglonglong

各sf.getEntries()呼び出しに@SuppressWarning( "unchecked")を配置したくない場合は、リストを返すラッパーをいつでも作成できます。

この他の質問 を参照してください

0
Boune

さらに簡単に

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

0
DennisTemper