1

在下面的代码中,我希望pn.get(8).get(8)返回一个数组Integers(在此示例中,数组的长度为 1,但在我的程序中它更长)。相反,我得到了一个Objects.

有人可以告诉我为什么以及我做错了什么。

ArrayList<ArrayList<HashSet<Integer>>> pn =
    new ArrayList<ArrayList<HashSet<Integer>>>();

for (int x = 0; x < 9; x++) 
{
    pn.add(x, new ArrayList<HashSet<Integer>>());

    for (int y = 0; y < 9; y++) {
        pn.get(x).add(y, new HashSet<Integer>());
        pn.get(x).get(y).add(new Integer(x));
    }
}


for (Integer i: pn.get(8).get(8).toArray())
{
    System.out.println(i);
}
4

5 回答 5

3

您需要做的就是删除语句中的toArray()调用,该调用返回而不是您可能期望的那样。这是Java 如何使用类型擦除实现泛型的工件。运行时,JVM 不知道您的类型是,因此必须返回一个.forObject[]Integer[]HashSetIntegertoArray()Object[]

谢天谢地,HashSet可以直接迭代,所以toArray()调用是不必要的。以下对我有用:

ArrayList<ArrayList<HashSet<Integer>>> pn = new ArrayList<ArrayList<HashSet<Integer>>>();

for (int x = 0; x < 9; x++) 
{
    pn.add(x, new ArrayList<HashSet<Integer>>());

    for (int y = 0; y < 9; y++) {
        pn.get(x).add(y, new HashSet<Integer>());
        pn.get(x).get(y).add(new Integer(x));
    }
}


for (Integer i: pn.get(8).get(8))
{
    System.out.println(i);
}
于 2013-04-18T09:48:52.670 回答
1

删除toArray(),它返回 a Object[],而您的循环变量是 a Integer,因此出现错误。

for (Integer i: pn.get(8).get(8))
  {
       System.out.println(i);
  }
于 2013-04-18T09:49:21.383 回答
1

<Collection>.toArray默认情况下将返回一个无类型 ( Object) 数组。要输入它,也就是说要使用哪种类型(Integer在您的情况下),请使用:

Integer[] integers = pn.get(8).get(8).toArray(new Integer[pn.get(8).get(8).size()]);
于 2013-04-18T09:49:39.383 回答
1

这是类型擦除的结果(请参阅此处的 oracle 文档),当您调用 toArray() 时,这会成为一个问题。因为 HashSet 是一个可迭代的集合,所以对 toArray() 的调用无论如何都是不必要的:您可以简单地使用for (Integer i: pn.get(8).get(8))

于 2013-04-18T09:50:40.023 回答
1

如果你真的想要数组试试这个

    HashSet<Integer> temp = pn.get(8).get(8);
    Integer i[] = new Integer[temp.size()] ;

    for (Integer j: temp.toArray(i)) {
        System.out.println(j);
    }

否则

    for (Integer j: pn.get(8).get(8)){
        System.out.println(j);
    }

会工作得很好。

于 2013-04-18T09:56:06.810 回答