用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));
^
当然:我可以通过宣布我首先要初始化的任何类型来“解决”这个问题,但这笔交易是什么?为什么梁说明和我认为可能之间的不一致,以及实际上是什么(至少就我的编译器而言)?
答案 0 :(得分:1)
如果您的计划的其余部分知道您的wait_queue
只是Collection
,则它没有get
或remove
方法。
您更正,因为您不希望将您的实施方式与变量的类型相关联,但您不应该使用Collection
,除非您只想迭代在内容上。使用List
,Set
或其他集合接口来描述集合。这些公开了您想要的get
和remove
(在List
)方法的情况下,并公开对象的行为(但不是实现 - 在这种情况下ArrayList
)。例如,List
允许重复,而Set
则不允许重复。