【发布时间】:2016-10-10 15:00:07
【问题描述】:
使用 Java 编程已经有几年了,所以我决定咨询一个古老的可靠来源。在梁的“Java 编程简介”中,第 1 页。 798,ArrayList 是这样安排的:
Collection<String> collection = new ArrayList<String>();
然后作者开始(仅)使用add() 方法并创建一个使用Iterator 的collection。
现在,我喜欢尽可能使用泛型类声明(现在来自 C 和 C++ 背景),因为如果我改变了我想用于某个解决方案的类型的想法,我可以只更改一行代码。理想情况下,我可以声明 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));
^
注意:Process 类型是“完全审查”的,不是这里的问题。
还有,
[...].java:72: error: cannot find symbol
return wait_queue.get(0);
^
当然:我可以通过声明我首先要初始化的任何类型来“解决”问题,但是有什么关系呢?为什么梁所说的与我认为可能的和实际可行的不一致(至少就我的编译器而言)?
【问题讨论】:
-
remove(int)的返回类型是什么?这和原来的Collection<String>有什么关系?wait_queue是什么?你的问题现在到处都是。请澄清并提供minimal reproducible example。 -
my_collection 的编译时类型是Collection,它既没有get 方法也没有remove(int) 方法。您将其初始化为 ArrayList 的事实是无关紧要的;就编译器而言,变量的类型仅作为集合被记住。如有疑问,请阅读官方文档;在 Java 中,文档不仅仅是为了帮助,它们是法律。
-
my_collection = ArrayList<String>;应该是my_collection = new ArrayList<String>();。 -
@shmosel 右:已修复。
-
@WatermarkBranding 不,你没有。
标签: java generics arraylist collections cannot-find-symbol