0

私はプライベート変数を次のように宣言します

private List<MultipartFile> files;

初期化する場合は、次のようにします。

files=new ArrayList<CommonsMultipartFile>();

CommonsMultipartFileがMultipartFileインターフェイスを拡張していることがわかります。コンパイルすると次のようなエラーが発生します。

Type mismatch: cannot convert from ArrayList<CommonsMultipartFile> to List<MultipartFile>

理由を知っている人はいますか?コレクションとクラス内タイプを本当に安定させたい場合、どうすればよいですか?C ++で同様のスタッフを行うことはできますか?

4

3 に答える 3

4

私が間違っていない場合、Javaジェネリックで:

AクラスB extends Aとジェネリックの2つのクラスがある場合class Generic<T>Generic<B>は拡張されませんGeneric<A>。そのため、キャストは機能しません。

あなたは次のように宣言することができますfiles

private List<? extends MultipartFiles> files;

これで、あなたはあなたの割り当てをすることができるはずです。

編集:他の応答で述べられているように、この宣言は。以外のものを追加することを防ぎnullます。確かに限られた関心...

于 2012-10-04T11:43:26.130 に答える
4

継承の原則は、typeパラメーターには適用されません。

List<MultipartFile> files=new ArrayList<MultipartFile>();

=>完全に有効です。

List<MultipartFile> files=new ArrayList<CommonsMultipartFile>();

=>完全に間違っています。

なぜコンパイラはこれをさせないのですか?

を作成すると仮定すると、要素ArrayList<CommonsMultipartFile>のみを持つことが期待されます。CommonsMultipartFileそこまで驚くことはありません。

ArrayListコンパイラがこれを参照型として割り当てることができる場合、拡張しているオブジェクトや!とは異なるオブジェクトList<MultipartFile>を入力することを妨げるものは何もありません。ArrayListMultipartFileCommonsMultipartFile

CommonsMultipartFile問題は、最初は要素のみを持つことを期待していたことです。

したがって、Java構文では、このような驚きはありません...

さらに、これを行うとprivate List<? extends MultipartFiles> files機能しますが、私が説明したのと同じ理由で、論理的にいくつかのオブジェクトを追加できなくなります。誤解されることが多いので注意してください。

後でこの参照型を使用してオブジェクトを追加する場合は、? extendsワイルドカードの代わりに実行することをお勧めします。private List<? super CommonsMultipartFile>CommonsMultipartFile

とにかく、ArrayListwithCommonMultipartFileオブジェクトのみを割り当てており、階層の上位にあるオブジェクトは割り当てていないため、この場合の最も適切な構文は次のとおりです。

List<MultipartFile> files=new ArrayList<MultipartFile>();
于 2012-10-04T11:46:45.517 に答える
0

MultipartFileの任意のサブタイプでリストを使用できるようにする場合は、両方の汎用パラメーターをMultipartFileにします。CommonsMultipartFileでのみ使用する場合は、両方のパラメーターをCommonsMultipartFileにします。そして、このリファレンスを通じてこのリストに何も入れなかったというまれなケースでは、代わりに次のようにすることができます。

List<? extends MultipartFile> files = ...

リストからアイテムを取得でき、それらは常にMultipartFileのサブタイプになりますが、nullを追加することしかできませんでした。

于 2012-10-04T11:50:57.883 に答える