在下面的代码中,我希望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);
}
答案 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);
}
工作得很好。