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

4

由于您想将一个集合中的所有元素添加到另一个集合,您可以使用Collection#addAll

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

通过您的编辑,您可以通过重新定义collRootDataArrayList<Collection<? extends RootData>>. 这是基于您当前代码的基本示例:

Collection<SpecialData> collSpecData = new ArrayList<SpecialData>();
ArrayList<Collection<? extends RootData>> collRootData = new ArrayList<Collection<? extends RootData>>();
collRootData.add(collSpecData);
于 2013-07-26T15:31:35.210 回答
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>是 a Collection<Vehicle>,你可以这样做

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

这将使泛型集合类型不安全。

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

于 2013-07-26T15:29:54.957 回答