【问题标题】:Initializing generic Collection [closed]初始化通用集合 [关闭]
【发布时间】:2016-10-10 15:00:07
【问题描述】:

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

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

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

现在,我喜欢尽可能使用泛型类声明(现在来自 C 和 C++ 背景),因为如果我改变了我想用于某个解决方案的类型的想法,我可以只更改一行代码。理想情况下,我可以声明 Collection&lt;some_type&gt; 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&lt;String&gt; 有什么关系? wait_queue 是什么?你的问题现在到处都是。请澄清并提供minimal reproducible example
  • my_collection 的编译时类型是Collection,它既没有get 方法也没有remove(int) 方法。您将其初始化为 ArrayList 的事实是无关紧要的;就编译器而言,变量的类型仅作为集合被记住。如有疑问,请阅读官方文档;在 Java 中,文档不仅仅是为了帮助,它们是法律。
  • my_collection = ArrayList&lt;String&gt;; 应该是my_collection = new ArrayList&lt;String&gt;();
  • @shmosel 右:已修复。
  • @WatermarkBranding 不,你没有。

标签: java generics arraylist collections cannot-find-symbol


【解决方案1】:

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

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

【讨论】:

  • Collection 实际上有删除方法
  • @ControlAltDel 对:只是不是我期待的属于ArrayList的重载。
  • 好的,我现在看到了。感谢您的回答。
猜你喜欢
  • 2013-03-04
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 2020-05-10
  • 2018-10-05
  • 2020-11-03
  • 1970-01-01
  • 2019-01-28
相关资源
最近更新 更多