当期望HashSet of Integer时,HashSet“无法从元素类型Object转换为Integer”

时间:2013-04-18 09:42:04

标签: java set hashset

在下面的代码中,我希望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);
}

5 个答案:

答案 0 :(得分:3)

您需要做的只是删除toArray()语句中的for来电,该语句将按照您的预期返回Object[]而不是Integer[]。这是Java implements generics using type erasure的工件。在运行时,JVM不知道您的HashSet类型为Integer,因此toArray()必须返回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);
}

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

默认情况下,

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

Integer[] integers = pn.get(8).get(8).toArray(new Integer[pn.get(8).get(8).size()]);

答案 3 :(得分:1)

这是由于类型擦除(See oracle doc here)而导致的,这在调用toArray()时会成为问题。因为HashSet是一个可迭代的集合,所以无论如何都不需要调用toArray():你只需使用for (Integer i: pn.get(8).get(8))

答案 4 :(得分: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);
    }

工作得很好。