0

私が持っています

Interface SpecialData extends RootData { ..}

この操作をコンパイルできません:

Collection<SpecialData> collSpecData = ...;
Collection<RootData> collRootData = ...;
collRootData.add((Collection<RootData>) collSpecData );

編集済み

Collection<SpecialData> collSpecData = ...;
ArrayList<Collection<RootData>> collRootData = ...; // Correction here : adding ArrayList
collRootData.add((Collection<RootData>) collSpecData );

では、各フィールドを反復SpecialDataしてキャストする必要がありますか? または、よりエレガントなソリューションを利用できますか?

4

3 に答える 3

1

はい、各メンバーを反復してキャストする必要があります。これは、Collection<RootData>が のスーパークラスではないためですCollection<SpecialData>

実際、私はこれをお勧めします:

Collection<SpecialData> collSpecData = //...
Collection<RootData> collRootData = //empty constructor
collRootData.addAll(collSpecData);
于 2013-07-26T15:26:57.507 に答える
0

もし aCollection<Bicycle>が だったらCollection<Vehicle>、あなたはできる

Collection<Bicycle> bicycles = ...;
Collection<Vehicle> vehicles = bicycles;
vehicles.add(new Car());

これにより、ジェネリック コレクションが型安全ではなくなります。

このメソッドで a 以外のものをコレクションCollection<? extends RootData>に追加したくないため、メソッドはおそらく as 引数を取る必要があります。SpecialDataそれが必要な場合は、コレクションのコピーが必要です。これにより、元のコレクションが であり続け、Collection<SpecialData>他に何も含まれていないことを確認できます。

于 2013-07-26T15:29:54.957 に答える