如何在Java中使用带有泛型类型的ArrayList.toArray()函数

时间:2014-09-05 08:34:02

标签: java generics arraylist

我有以下代码,我想知道这是否是返回数组的正确方法。 我的函数返回Page<byte[]>[](一个Page<byte[]>的数组),并且我使用ArrayList作为容器。

pages是一个私有的HashMap成员。 Page是我创建的具有泛型类型T的成员的对象。

最后我返回使用toArray转换的ArrayList,但是我不能告诉它将它转换为Page数组对象,它需要一个固定的大小(new Page [pageArray.size()])和我认为这不是正确的方法。

什么是正确的方法?

public Page<byte[]>[] getPages(Integer[] pageIds){
    ArrayList<Page<byte[]>> pageArray = new ArrayList<Page<byte[]>>();
    for (int pageId : pageIds){
        if (pages.containsKey(pageId)){
            pageArray.add(pages.get(pageId));
        }
    }
    return pageArray.toArray(new Page[pageArray.size()]);
    //return pageArray.toArray(Page);

3 个答案:

答案 0 :(得分:1)

如果您必须对它们执行此类操作,我无法理解您使用数组而不是列表的原因。

无论如何,你的方法是正确的,并且做了工作。不使用ArrayList的另一种方法可以是这个:

public Page<byte[]>[] getPages(Integer[] pageIds){
    int count = 0;
    for (int i=0; i<pageIds.length;i++){
        if (pages.containsKey(pageIds[i])){
            count++;
            pageIds[i] = -1; //BEWARE! this modifies the original pageIds array!
        }
    }
    int retCount = 0;
    Page<byte[]>[] ret = new Page<byte[]>[count];
    for (int i=0; i<pageIds.length;i++){
        if(pageIds[i]!=-1){
            ret[retCount] = pages.get(pageIds[i]);
            retCount++;
        }
    }
    return ret;
}

但它确实没有为你的方法添加任何东西......

答案 1 :(得分:0)

这应该有效:

    @SuppressWarnings("unchecked")
    public Page<byte[]>[] getPages(Integer[] pageIds) {

      final ArrayList<Page<byte[]>> pageArray = new ArrayList<Page<byte[]>>();

      for (int pageId : pageIds) {
        if (pages.containsKey(pageId)) {
          pageArray.add(pages.get(pageId));
        }
      }

      return pageArray.toArray(new Page[pageArray.size()]);
    }

答案 2 :(得分:-1)

我建议使用一个空参数,因为这样你就不会创建任何大的临时对象:

return pageArray.toArray(new Page[0]);

大小取决于pageArray的大小。