2011-10-14 10 views
9

の春のバッチのItemWriterのインターフェイスはこれです:リストをキャストする方法<? Foo>を<Foo>にリストする

write(List<? extends T> items); 

私は、サービスを呼び出すためにItemWriterが欲しいのですが、私のサービスはこれを持っている:

process(List<T> items); 

私の知る限り、Javaのジェネリックは、コレクション内の型のキャストについて厳しいです。

+0

の答えで説明されていますアイテム) '? – ILMTitan

+1

それは私が欲しいものですから。私は春が言うことを遵守する必要はありません。 – pritam

+0

なぜそれが欲しいですか?あなたはアイテムに要素を挿入していますか(ワイルドカードを作ることで失う唯一の機能)ですか? – ILMTitan

答えて

9

だけ先に行くと、それをキャスト。読んで、List<? extends Foo>は確かにList<Foo>です、キャストは絶対に安全です。あなたが不自由な人なら、それをCollections.unmodifiableList()で包むことができます。

+1

ブリリアント。あなたはGOD> PSです:なぜJava Generics SUCKに注意してください。 – pritam

+3

なぜ余分な(リスト)キャスト? –

+0

これは動作していません –

2

サービスで? extends Tが許可されている場合は、そのタイプを指定する必要があります。現在、渡される内容は正確にTである必要があります。

+0

彼は明示的に、サービスはリストではなく、リストを受け入れると言います。 –

7

メソッドがTから継承するオブジェクトを受け取り、キャストを実行していることを確認してください。

または、メソッドのシグネチャを書き込みメソッドと同じに変更します。あなたはそれFooであることをFoo拡張タイプを持っている場合ことを知っているので、

+0

なぜ私の春の署名を変更する必要がありますか? NO。 – pritam

+1

私は変更するつもりはないと言って、ちょっとした提案をしました。彼は与えられたキャストオプションを使うことができました。 –

0

は、あなたはそれをキャストすることができませんか?このような
何か:

write(List<? extends Foo> items) { 
    //noinspection unchecked 
    process((List<Foo>) items); 
} 

process(List<Foo> items) { 
    // ... 
} 
+0

アイテムが 'List 'タイプであることが100%保証されていない場合は、潜在的な例外を必ず捕捉してください。 –

+0

これはJavaコンパイラエラーをスローします。したがって、Q. – pritam

1

遺伝的にはコンパイル時に役立ちます。何かをキャストして、その値が新しいタイプに対してキャスト可能であることを確認してください。 list2list1の読み取り専用ビューにする必要があり、なぜ

2
List<? extends Foo> list1 = ... 
List<Foo> list2 = Collections.unmodifiableList(list1); 

理由はうまくあなたのサービスは `プロセス(一覧`プロセス(一覧 項目) `持っていないのはなぜ Generics : List is same as List?

関連する問題