【问题标题】:Why is upcasting arrays allowed, while not with generics? [duplicate]为什么允许向上转换数组,而不是泛型? [复制]
【发布时间】:2014-08-05 14:18:47
【问题描述】:

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

    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

为什么编译器不会阻止我对数组进行向上转换,因为阻止我进行泛型向上转换会很麻烦?

【问题讨论】:

    标签: java arrays generics


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-27
      • 2020-07-02
      • 1970-01-01
      相关资源
      最近更新 更多