这个问题已经有了答案: 为什么数组是协变的但泛型是不变的?
这个问题已经有了答案:
为什么数组是协变的但泛型是不变的?
以下的泛型代码无法编译,我可以理解为什么:这是为了防止不兼容的类型被添加到集合中:
List objectList = new ArrayList(); List stringList = new ArrayList(); 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 为什么编译器不会阻止我进行数组的向上转型,而要费力阻止我进行泛型的向上转型呢? admin 更改状态以发布 2023年5月21日
然而,我可以用数组完成同样的事情,并且没有编译器错误。当我运行它时,我得到一个ArrayStoreException。
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
为什么编译器不会阻止我进行数组的向上转型,而要费力阻止我进行泛型的向上转型呢?
当你试图将不正确的类型放入数组中时,JVM能够在运行时通过抛出ArrayStoreException来停止。
但是在泛型的情况下,这种机制是不可能的(至少在不使用检查列表的情况下),因为由于类型擦除的缘故,JVM无法在运行时阻止你,所以它会在编译时提前阻止你。
用户名或邮箱地址
密码