初始化泛型集合
Initializing generic Collection
在 Java 中编程已经有几年了,所以我决定咨询一个古老的可靠来源。在 Liang 的 "Introduction to Java Programming" 中,pg。 798,ArrayList
安排如下:
Collection<String> collection = new ArrayList<String>();
然后作者开始使用(仅)add()
方法并创建一个使用 collection
的 Iterator
。
现在,我喜欢尽可能使用通用的 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
,它没有 get
或 remove
方法。
你是对的,因为你不想将你的实现与变量的类型耦合,但是你不应该使用 Collection
除非你只想迭代内容。使用 List
、Set
或其他集合接口来描述集合。这些暴露了你想要的get
和remove
(在List
的情况下)方法,并暴露了对象的行为(但不是实现 - 在本例中为 ArrayList
)。例如,List
允许重复,而 Set
不允许。
在 Java 中编程已经有几年了,所以我决定咨询一个古老的可靠来源。在 Liang 的 "Introduction to Java Programming" 中,pg。 798,ArrayList
安排如下:
Collection<String> collection = new ArrayList<String>();
然后作者开始使用(仅)add()
方法并创建一个使用 collection
的 Iterator
。
现在,我喜欢尽可能使用通用的 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
,它没有 get
或 remove
方法。
你是对的,因为你不想将你的实现与变量的类型耦合,但是你不应该使用 Collection
除非你只想迭代内容。使用 List
、Set
或其他集合接口来描述集合。这些暴露了你想要的get
和remove
(在List
的情况下)方法,并暴露了对象的行为(但不是实现 - 在本例中为 ArrayList
)。例如,List
允许重复,而 Set
不允许。