0

我正在试验 Java HashSet 类及其 toArray() 方法。下面是我想出的代码。编译器没有显示任何错误,但是当我运行代码时,IDE 会输出错误消息:

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;
    at JTOCollection.TheCollectionInterface.main(TheCollectionInterface.java:26)
Java Result: 1

由于我缺乏经验,我无法完全理解错误消息背后的完整原因,有人可以向我解释一下吗?

Set<Integer> set1 = new HashSet<>();
set1.add(1);
set1.add(2);
set1.add(3);
set1.add(2);

Integer[] intArray = (Integer[]) set1.toArray();
for(Integer i : intArray){
    System.out.println(i);
}
4

3 回答 3

5

因为您使用public Object[] toArray()的是public <T> T[] toArray(T[] a).

用这个:

Integer[] intArray =  set1.toArray(new Integer[set1.size()]);

文档:public <T> T[] toArray(T[] a)

返回一个包含此集合中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。如果集合适合指定的数组,则在其中返回。否则,将使用指定数组的运行时类型和此集合的大小分配一个新数组。

于 2016-03-10T03:33:13.527 回答
2

set1.toArray()是 Object[],不能转换为 Integer[]。如果你想有一个 Integer[] 试试这个:

Integer[] intArray = set1.toArray(new Integer[set1.size()]);
于 2016-03-10T03:33:05.090 回答
0

方法 set1.toArray() 返回 Object[],您需要将返回数组中的每个对象显式转换为 Integer。下面的代码将为您工作。

Set<Integer> set1 = new HashSet<>();
    set1.add(1);
    set1.add(2);
    set1.add(3);
    set1.add(2);

    Object[] intArray = set1.toArray();
    for(Object i : intArray){
        System.out.println(i);
    }
于 2016-03-10T03:33:16.673 回答