我有
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
和投射每个字段?或者是更优雅的解决方案?
答案 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
,并且不包含任何其他内容。