Cast Collection <dependantinterface>到Collection <rootinterface> fail </rootinterface> </dependantinterface>

时间:2013-07-26 15:24:01

标签: java

我有

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投射每个字段?或者是更优雅的解决方案?

3 个答案:

答案 0 :(得分:4)

由于您要将所有元素从一个集合添加到另一个集合,因此您可以使用Collection#addAll

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

通过编辑,您可以通过将collRootData重新定义为ArrayList<Collection<? extends RootData>>来执行快速修复。这是基于您当前代码的基本示例:

Collection<SpecialData> collSpecData = new ArrayList<SpecialData>();
ArrayList<Collection<? extends RootData>> collRootData = new ArrayList<Collection<? extends RootData>>();
collRootData.add(collSpecData);

答案 1 :(得分:1)

是的,您必须迭代并投射每个成员。原因是Collection<RootData>不是Collection<SpecialData>的超类。

其实我推荐这个:

Collection<SpecialData> collSpecData = //...
Collection<RootData> collRootData = //empty constructor
collRootData.addAll(collSpecData);

答案 2 :(得分:0)

如果Collection<Bicycle>Collection<Vehicle>,您可以

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

会使通用集合类型不安全。

你的方法应该以{{1​​}}作为参数,因为你真的不希望这个方法在集合中添加Collection<? extends RootData>以外的东西。如果这就是你想要的,那么你需要一个集合的副本,以确保原始集合保持SpecialData,并且不包含任何其他内容。