为什么允许上传阵列,而不是泛型呢?

时间:2014-06-15 17:19:32

标签: java arrays generics

以下泛型代码无法编译,我可以理解为什么:阻止将可能不兼容的类型添加到集合中:

    List<Object> objectList = new ArrayList<Object>();
    List<String> stringList = new ArrayList<String>();
    objectList = stringList; // 'Incompatible types' compiler error
    // I understand the compilation error above
    // is to stop you adding incompatible types
    objectList.add(Integer.valueOf(1024));

但是,我可以对数组做同样的事情,并且没有编译器错误。当我运行它时,我得到一个ArrayStoreException

    Object[] objectArray = new Object[10];
    String[] stringArray = new String[10];
    objectArray = stringArray; // No compiler error on this line
    objectArray[0] = Integer.valueOf(1024); // 'java.lang.ArrayStoreException: java.lang.Integer' runtime error

为什么编译器不会阻止我进行数组upcast,因为它会阻止我进行泛型upcast?

1 个答案:

答案 0 :(得分:2)

正如您所注意到的那样,当您尝试将不正确的类型放入数组时,JVM可以通过抛出ArrayStoreException来在运行时停止。

但是在泛型的情况下,由于checked list这样的机制是不可能的(至少在你没有使用type erasure的情况下),所以因为JVM不能在运行时阻止你,它会阻止你在编译时。