我在这里读过类似的问题,但我仍然有点困惑。
MyCollection extends ArrayList<MyClass>
MyClass implements Data
然而这给了我“无法从ArrayList转换为MyCollection”
MyCollection mycollection = somehandler.getCollection();
其中getCollection看起来像这样
public ArrayList<Data> getCollection()
所以我的假设显然是错误的。我怎样才能使这项工作像我希望的那样
答案 0 :(得分:4)
ArrayList
不会延伸MyCollection
。反过来说。
有多种方法可以解决此问题,具体取决于功能要求:
MyCollection
构造函数,该构造函数可以使用另一个Collection
。MyCollection
,则您需要将ArrayList
投射到MyCollection
。MyCollection
,则您需要将返回类型更改为MyCollection
。那说,是什么让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。