初始化泛型集合

Initializing generic Collection

在 Java 中编程已经有几年了,所以我决定咨询一个古老的可靠来源。在 Liang 的 "Introduction to Java Programming" 中,pg。 798,ArrayList 安排如下:

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

然后作者开始使用(仅)add() 方法并创建一个使用 collectionIterator

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

的任何类型

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

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));
                                         ^

注意:Process 类型是 "fully-vetted" 并且不是这里的问题。

此外,

[...].java:72: error: cannot find symbol
        return wait_queue.get(0);
                         ^

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

就程序的其余部分而言,您的 wait_queue 只是一个 Collection,它没有 getremove 方法。

你是对的,因为你不想将你的实现与变量的类型耦合,但是你不应该使用 Collection 除非你只想迭代内容。使用 ListSet 或其他集合接口来描述集合。这些暴露了你想要的getremove(在List的情况下)方法,并暴露了对象的行为(但不是实现 - 在本例中为 ArrayList)。例如,List 允许重复,而 Set 不允许。