当前位置: 首页 > 知识库问答 >
问题:

为什么允许上转换数组,而不允许泛型?[副本]

闾丘晨
2023-03-14

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

    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

为什么编译器不阻止我上传数组,因为它会麻烦地阻止我上传泛型?

共有1个答案

白星海
2023-03-14

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

但是在泛型的情况下,由于类型擦除,这种机制是不可能的(至少在不使用检查列表的情况下),所以由于JVM不能在运行时阻止您,它会在编译时更早地阻止您。

 类似资料:
  • 问题内容: 我想知道Java中是否有特殊原因总是使用“ ”而不是“ ”来定义类型参数的界限。 例: 被禁止但是 是正确的。是什么原因呢? 问题答案: 在类“实现”还是“扩展”之间,通用约束语言没有语义差异。约束可能性是“扩展”和“超级”-也就是说,该类是可分配给其他类的对象(扩展),还是该类可从该类分配(超级)。

  • 问题内容: 作为实验,我尝试扩展-array,如下所示: 在类本身中添加一些与排序,交换,子数组构建等有关的方法。但是我在编译时遇到了这个错误: 我很好奇:为什么Java不允许扩展数组? 问题答案: 扩展基本类型(例如a 或数组)会打开安全漏洞。如果Java允许您扩展数组,则采用数组的方法将变得不安全。这就是字符串为,而数组根本不能扩展的原因。 例如,您可以重写该方法,并返回不正确大小的数组。这有

  • 我正在阅读jls§5.1.7,它说有9种拳击类型,第9种是拳击 然后我读到的拆箱转换会抛出一个。好的,这很明显。那么为什么的装箱不会抛出一个以及装箱值有什么用呢?

  • 问题内容: 通常,Java可被视为类型安全的语言。我知道泛型有一些缺陷,但是最近我遇到了一个从未有过的问题。分解: 不会导致预期的编译时错误。我假设Array的声明将不允许指向其他数组。在泛型中,我不允许做类似以下这样的怪异的事情: 如果我尝试诱使Java做一些事情 可以声明它,但只能添加type的对象。 Java为什么不阻止声明这种奇怪的数组? 问题答案: 我认为除了“传统设计”之外,没有其他答

  • 问题内容: 我想知道为什么Java不允许将布尔值转换为整数,如下所示: 例如,这可以用一行代码来完成, 但似乎更好和更容易阅读的方法是允许类型转换,如和一样。Java为什么不包括此功能? 问题答案: 不允许这样做是因为Java设计人员(正确地)认识到C和C ++中的布尔/整数重载是错误的重要来源。 (我记得曾经写过一些设计原理的书,但我找不到。) 例如: 是合法的,但可能是用C或C ++编写的应用