繁体   English   中英

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

[英]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不知道您的HashSetInteger类型的,因此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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM