考虑以下Java ArrayList#toArray方法测试.请注意,我从这个有用的答案中借用了代码.
public class GenericTest {
    public static void main(String [] args) {
        ArrayList<Integer> foo = new ArrayList<Integer>();
        foo.add(1);
        foo.add(2);
        foo.add(3);
        foo.add(4);
        foo.add(5);
        Integer[] bar = foo.toArray(new Integer[10]);
        System.out.println("bar.length: " + bar.length);
        for(Integer b : bar) { System.out.println(b); }
        String[] baz = foo.toArray(new String[10]);       // ArrayStoreException
        System.out.println("baz.length: " + baz.length);
    }
}
但是,请注意,ArrayStoreException在尝试Integer进入时会有一个时间String[].
输出:
$>javac GenericTest.java && java -cp . GenericTest
bar.length: 10
1
2
3
4
5
null
null
null
null
null
Exception in thread "main" java.lang.ArrayStoreException
        at java.lang.System.arraycopy(Native Method)
        at java.util.ArrayList.toArray(Unknown Source)
        at GenericTest.main(GenericTest.java:16)
在编译时通过Java泛型可以防止这个错误吗?
ArrayStoreException 正是因为Java的类型系统无法正确处理这种情况(IIRC,当Generics出现时,以与集合框架相同的方式改造阵列为时已晚).
因此,在编译时通常无法阻止此问题.
您当然可以创建内部API来包装此类操作,以减少意外获取类型错误的可能性.
也可以看看: