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

Tho*_*hor 0 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
Run Code Online (Sandbox Code Playgroud)

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

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);
}
Run Code Online (Sandbox Code Playgroud)

Ram*_*lfc 5

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

用这个:

Integer[] intArray =  set1.toArray(new Integer[set1.size()]);
Run Code Online (Sandbox Code Playgroud)

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

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

  • 使速度更快的原因是,如果传递给该方法的Integer数组的长度与set1相同,则因为不再需要调整大小。如果您经常转换数组,使用`Integer [] intArray = set1.toArray(new Integer [set1.size()]);会带来较小的改进。 (4认同)