代码之家  ›  专栏  ›  技术社区  ›  James McMahon

Collections.copy是否已损坏(在OpenJDK 6中)?

  •  3
  • James McMahon  · 技术社区  · 16 年前

    有时我似乎效率很低。当我几乎完成输入时,我设法在Sun上找到了相应的错误报告。然后我想好了,不妨把它贴出来,有截图等等。答案如下。

    List<IGraphEdge> rgSrc = this._rgGetPath();
    List<IGraphEdge> rgDst = new ArrayList<IGraphEdge>(rgSrc.size());
    Collections.copy(rgDst, rgSrc);
    

    这引发了一场争论 IndexOutOfBoundException 带着信息

    java.lang.IndexOutOfBoundsException: Source does not fit in dest
            at java.util.Collections.copy(Collections.java:548)
    

    ArrayList 实例如下所示:

    Debugger view http://static.theuprightape.net/ql/img/debugger.png

    dest src ,虽然 size 目的地 还是0,毕竟,这是我想通过调用 copy() .

    查看OpenJDK实现的源代码,很清楚抛出错误的原因:

    public static <T> void copy(List<? super T> dest, List<? extends T> src) {
        int srcSize = src.size();
        if (srcSize > dest.size())
            throw new IndexOutOfBoundsException("Source does not fit in dest");
    

    所以请告诉我,这是一个错误,还是我做错了什么?

    4 回复  |  直到 16 年前
        1
  •  4
  •   erickson    16 年前

    它不是在看电视 ,它在看尺寸。也就是说,目标应该包含元素,这些元素将被源列表覆盖。

    我从未遇到过这样有用的情况。通常,您需要的是一个 List addAll 方法 Collection 接口。

        2
  •  2
  •   Steve B.    16 年前

    从一个文件中复制所有元素 目标列表中的元素将 来源列表。 必须创建目标列表 列表 目标列表中的元素是

    我同意你的观点,这不是非常直观,但看起来你真正想要做的更像克隆()。

        3
  •  2
  •   James McMahon    16 年前

    我不是第一个遇到这种情况的,但这真的总是你的错。根据对 this bug report Collections.copy 不打算这样使用,您应该使用 List.appendAll() 相反

    所以我修改了代码,使其看起来像这样,并且它起了作用:

    List<IGraphEdge> rgSrc = this._rgGetPath();
    List<IGraphEdge> rgDst = new ArrayList<IGraphEdge>(rgSrc.size());
    rgDst.addAll(rgSrc);
    

    嗯。

        4
  •  1
  •   Mark Bolusmjak    16 年前

    抛出:IndexOutOfBoundsException-如果 目标列表太小,无法访问

    因此,它似乎符合规范。