试图将setInstance.toArray()强制转换为Integer [],没有编译时错误但是有运行时错误,为什么?

时间:2016-03-10 03:29:28

标签: java casting set toarray

我正在尝试使用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);
}

3 个答案:

答案 0 :(得分:4)

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

使用它:

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

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

  

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

答案 1 :(得分:2)

set1.toArray()是一个Object [],无法强制转换为Integer []。如果你想要一个Integer []试试这个:

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

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