This question already has answers here:
Catching ArrayStoreException at Compile-time
                                
                                    (4个答案)
                                
                        
                                2年前关闭。
            
                    
从ArrayStoreException的Java文档


  抛出以表明已尝试存储错误的内容
  将对象类型转换为对象数组。


为了避免这种异常,我使用了泛型。但是当我运行以下测试程序时:

public class Test {
    public static void main(String[] args) {
        Collection<Number> nums = new ArrayList<Number>();
        nums.add(new Integer(1));
        nums.add(new Long(-1));
        Integer[] ints = nums.toArray(new Integer[nums.size()]);

        for (Integer integer : ints) {
            System.out.println(integer);
        }
    }
}


我得到的ArrayStoreException如下-我没想到。

Exception in thread "main" java.lang.ArrayStoreException
    at java.lang.System.arraycopy(Native Method)
    at java.util.ArrayList.toArray(ArrayList.java:408)


有人可以帮助我理解为什么即使我的列表是泛型类型也抛出此异常。

最佳答案

您的ArrayList包含LongLong不能存储在Integer数组中,因为Integer不是Long的超类型。

以下将起作用:

Number[] ints = nums.toArray(new Number[nums.size()]);

for (Number integer : ints) {
    System.out.println(integer);
}


toArray的Javadoc中明确指出了这一点:


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

07-27 14:58