将HashSet转换为数组时抛出ArrayStoreException

时间:2017-03-09 02:54:41

标签: java set hashset

我的代码如下:

    int[] ho = new int[10];
    ho[0]= 1;
    ho[2]= 1;
    ho[4]= 5;

    HashSet<Integer> hs = new HashSet(Arrays.asList(ho));

    Integer[] a = hs.toArray(new Integer[hs.size()]);

这段代码对我来说很有意义,但是当我运行它时会抛出ArrayStoreException。这是为什么? HashSet是一组Integer s,输出数组也是如此。

2 个答案:

答案 0 :(得分:3)

ArrayStoreException:“如果指定数组的运行时类型不是此集合中每个元素的运行时类型的超类型”

抛出

ArrayStoreException表示已尝试将错误类型的对象存储到对象数组中。

尝试切换int[] to Integer[]

答案 1 :(得分:1)

问题是你正在跳过泛型类型,所以你没有看到错误,即使它错了,Java也无法拒绝你的代码。

问题是Arrays::asList的签名是asList(T... values),但T不能是原始的,因此可变参数会折叠成int[](这是现在是一个对象)而Arrays.asList会返回List<int[]>

然后将其传递给通用HashSet构造函数,然后接受Collection<Object>没有任何问题,并将其分配给HashSet<Integer>,编译器会警告您使用原始类型。< / p>

最后,您尝试将哈希集中的元素(类型为int[])分配给导致异常的Integer[]数组中的元素,就像执行

一样
Integer[] data = new Integer[5];
data[0] = new int[] {1, 2, 3};

这是错误的,但Java无法在编译时实现它。

如果您构造了HashSetnew HashSet<>,则Java编译器会出现错误。您可以通过将Integer[]传递给asList方法来解决问题,以便将其正确地视为可变参数。