の春のバッチのItemWriterのインターフェイスはこれです:リストをキャストする方法<? Foo>を<Foo>にリストする
write(List<? extends T> items);
私は、サービスを呼び出すためにItemWriterが欲しいのですが、私のサービスはこれを持っている:
process(List<T> items);
私の知る限り、Javaのジェネリックは、コレクション内の型のキャストについて厳しいです。
の春のバッチのItemWriterのインターフェイスはこれです:リストをキャストする方法<? Foo>を<Foo>にリストする
write(List<? extends T> items);
私は、サービスを呼び出すためにItemWriterが欲しいのですが、私のサービスはこれを持っている:
process(List<T> items);
私の知る限り、Javaのジェネリックは、コレクション内の型のキャストについて厳しいです。
だけ先に行くと、それをキャスト。読んで、List<? extends Foo>
は確かにList<Foo>
です、キャストは絶対に安全です。あなたが不自由な人なら、それをCollections.unmodifiableList()
で包むことができます。
ブリリアント。あなたはGOD> PSです:なぜJava Generics SUCKに注意してください。 – pritam
なぜ余分な(リスト>)キャスト? –
これは動作していません –
サービスで? extends T
が許可されている場合は、そのタイプを指定する必要があります。現在、渡される内容は正確にT
である必要があります。
彼は明示的に、サービスはリスト extends T>ではなく、リスト
メソッドがTから継承するオブジェクトを受け取り、キャストを実行していることを確認してください。
または、メソッドのシグネチャを書き込みメソッドと同じに変更します。あなたはそれがFoo
であることをFoo
拡張タイプを持っている場合ことを知っているので、
なぜ私の春の署名を変更する必要がありますか? NO。 – pritam
私は変更するつもりはないと言って、ちょっとした提案をしました。彼は与えられたキャストオプションを使うことができました。 –
は、あなたはそれをキャストすることができませんか?このような
何か:
write(List<? extends Foo> items) {
//noinspection unchecked
process((List<Foo>) items);
}
process(List<Foo> items) {
// ...
}
アイテムが 'List
これはJavaコンパイラエラーをスローします。したがって、Q. – pritam
遺伝的にはコンパイル時に役立ちます。何かをキャストして、その値が新しいタイプに対してキャスト可能であることを確認してください。 list2
がlist1
の読み取り専用ビューにする必要があり、なぜ
List<? extends Foo> list1 = ...
List<Foo> list2 = Collections.unmodifiableList(list1);
理由はうまくあなたのサービスは `プロセス(一覧`プロセス(一覧
の答えで説明されていますアイテム) '? – ILMTitan
それは私が欲しいものですから。私は春が言うことを遵守する必要はありません。 – pritam
なぜそれが欲しいですか?あなたはアイテムに要素を挿入していますか(ワイルドカードを作ることで失う唯一の機能)ですか? – ILMTitan