类型不匹配:无法从ArrayList <data>转换为MyCollection </data>

时间:2010-04-08 12:06:35

标签: java generics

我在这里读过类似的问题,但我仍然有点困惑。

 MyCollection extends ArrayList<MyClass>

 MyClass implements Data

然而这给了我“无法从ArrayList转换为MyCollection”

 MyCollection mycollection = somehandler.getCollection();

其中getCollection看起来像这样

 public ArrayList<Data> getCollection()

所以我的假设显然是错误的。我怎样才能使这项工作像我希望的那样

6 个答案:

答案 0 :(得分:4)

ArrayList不会延伸MyCollection。反过来说。

有多种方法可以解决此问题,具体取决于功能要求:

  1. 您需要提供一个MyCollection构造函数,该构造函数可以使用另一个Collection
  2. 如果实际类型为MyCollection,则您需要将ArrayList投射到MyCollection
  3. 如果实际类型为MyCollection,则您需要将返回类型更改为MyCollection
  4. 那说,是什么让MyCollection变得如此不同以至于它显然不符合List的合同,因此你需要转换/转换它?这不应该发生,我会重新考虑设计/方法。

答案 1 :(得分:1)

你不能从超类型分配子类型,但你可以实现一个复制构造函数,然后你可以做同样的事情:

MyCollection myCollection = new MyCollection(somehandler.getCollection());

编辑:构造函数的参数类型可以是例如List。

答案 2 :(得分:1)

好吧,想象你有

class SecondCollection extends ArrayList<MyClass>

那么ArrayList<MyClass>会被投射到什么地方?

您需要预期ArrayList或返回MyCollection,或将ArrayList的内容复制到MyCollection的新实例,或明确转换为{{1} }}。我不推荐最后一个选项。

答案 3 :(得分:0)

你只需要投射结果

MyCollection mycollection = (MyCollection) somehandler.getCollection();

修改:或将getCollection()的返回类型更改为MyCollection

答案 4 :(得分:0)

查看the generics tutorial的第4页。

答案 5 :(得分:0)

ArrayList<Data>无法投放到MyCollection甚至ArrayList<MyClass>。有关详细说明,请参阅this post