[英]HashSet “cannot convert from element type Object to Integer” when expecting a HashSet of Integer
在下面的代码中,我希望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);
}
您所需要做的就是删除for
语句中的toArray()
调用,该调用将返回Object[]
而不是您可能期望的Integer[]
。 这是Java如何使用类型擦除实现泛型的工件。 在运行时,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);
}
删除toArray()
,它返回一个Object[]
,而循环变量是Integer
,因此是错误的。
for (Integer i: pn.get(8).get(8))
{
System.out.println(i);
}
默认情况下, <Collection>.toArray
将返回一个无类型的( Object
)数组。 要键入它,即使用哪种类型(在您的情况下为Integer
),请使用:
Integer[] integers = pn.get(8).get(8).toArray(new Integer[pn.get(8).get(8).size()]);
发生这种情况是由于类型擦除引起的(请参见oracle doc) ,这在调用toArray()时成为问题。 因为HashSet是一个可迭代的集合,所以无论如何都不需要调用toArray():您可以简单地for (Integer i: pn.get(8).get(8))
如果您真的想要数组尝试此
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);
}
会很好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.