用 Java 编程已经有几年了,所以我决定咨询一个古老的、可靠的来源。在梁的“Java 编程简介”中,第 1 页。798,一个ArrayList
是这样安排的:
Collection<String> collection = new ArrayList<String>();
然后作者开始使用(仅)该add()
方法并创建一个使用一个Iterator
of collection
。
现在,我喜欢尽可能使用泛型类声明(现在来自 C 和 C++ 背景),因为如果我改变了我想用于某个解决方案的类型的想法,我可以只更改一行代码。理想情况下,我将能够声明一个Collection<some_type> my_collection
(无论是成员变量还是局部变量),然后将其定义为扩展Collection
类的任何类型。
但是,当我尝试执行以下操作时,
Collection<String> my_collection;
再后来,
my_collection = ArrayList<String>();
我得到编译错误:即编译器找不到get()
andremove()
符号(或者至少不是我认为我正在调用的重载方法的版本)。例如,
[...].java:48: error: incompatible types: boolean cannot be converted to Process
otherAlg.addJob(wait_queue.remove(0));
^
注意: Process 类型是“完全审查”的,不是这里的问题。
还,
[...].java:72: error: cannot find symbol
return wait_queue.get(0);
^
当然:我可以通过首先声明我要初始化的任何类型来“解决”这个问题,但是有什么关系呢?为什么梁所说的与我认为可能的和实际可行的不一致(至少就我的编译器而言)?