初始化通用集合

时间:2016-06-09 19:35:27

标签: java generics arraylist collections cannot-find-symbol

用Java编程已经有几年了,所以我决定咨询一个古老,可靠的来源。在梁先生的“Java编程简介”中。 798,ArrayList计划如下:

Collection<String> collection = new ArrayList<String>();

然后,作者继续使用(仅)add()方法并创建使用Iterator的{​​{1}}。

现在,我喜欢尽可能使用泛型类声明(现在来自C和C ++背景),因为如果我改变主意想要用于某些解决方案的类型,我只能更改一行码。理想情况下,我可以声明collection(无论是成员还是局部变量),然后将其定义为扩展Collection<some_type> my_collection类的任何类型。

但是,当我尝试执行以下操作时,

Collection

然后,

Collection<String> my_collection;

我遇到编译错误:即编译器找不到my_collection = ArrayList<String>(); get()符号(或者至少不是我相信的重载方法的版本我是调用)。例如,

remove()

注意:类型过程是“完全审查的”,这里不是问题。

此外,

[...].java:48: error: incompatible types: boolean cannot be converted to Process
        otherAlg.addJob(wait_queue.remove(0));
                                         ^

当然:我可以通过宣布我首先要初始化的任何类型来“解决”这个问题,但这笔交易是什么?为什么梁说明和我认为可能之间的不一致,以及实际上是什么(至少就我的编译器而言)?

1 个答案:

答案 0 :(得分:1)

如果您的计划的其余部分知道您的wait_queue只是Collection,则它没有getremove方法。

您更正,因为您不希望将您的实施方式与变量的类型相关联,但您不应该使用Collection,除非您只想迭代在内容上。使用ListSet或其他集合接口来描述集合。这些公开了您想要的getremove(在List)方法的情况下,并公开对象的行为(但不是实现 - 在这种情况下ArrayList)。例如,List允许重复,而Set则不允许重复。