-1

用 Java 编程已经有几年了,所以我决定咨询一个古老的、可靠的来源。在梁的“Java 编程简介”中,第 1 页。798,一个ArrayList是这样安排的:

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

然后作者开始使用(仅)该add()方法并创建一个使用一个Iteratorof 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);
                         ^

当然:我可以通过首先声明我要初始化的任何类型来“解决”这个问题,但是有什么关系呢?为什么梁所说的与我认为可能的和实际可行的不一致(至少就我的编译器而言)?

4

1 回答 1

1

至于你的程序的其余部分知道你wait_queue只是一个Collection,它没有getremove方法。

你是正确的,因为你不想将你的实现与变量的类型结合起来,但是你不应该使用Collection,除非你只想迭代内容。使用ListSet或其他集合接口来描述集合。这些公开了您想要的getand remove(在 的情况下List)方法,并公开了对象的行为(但不是实现 - 在这种情况下ArrayList)。例如,aList允许重复,而 aSet不允许。

于 2016-06-09T19:47:03.290 回答