【问题标题】:Why collection types check happen only at compile, and Array types are checked at compile time and Runtime为什么只在编译时检查集合类型,而在编译时和运行时检查数组类型
【发布时间】:2017-04-20 13:01:28
【问题描述】:

为什么集合类型检查只发生在编译时, 和数组类型在编译时和运行时检查。

【问题讨论】:

  • 因为维度和内存分配。
  • 可能是因为泛型在 Java 5 中以不破坏向后兼容性的方式侵入了该语言。

标签: java generics collections


【解决方案1】:

Java 使用类型擦除是因为正如@khelwood 在评论中指出的那样,泛型是事后才想到的,并在 1.5 中引入了该语言。

此外,运行时类型检查的计算量很大,因此在编译时处理检查以减少运行时检查的需要。

此外,正如 InjuredThePatient 在 cmets 中所指出的,您所看到的 ArrayLists 的“运行时类型检查”实际上是内存分配错误。

【讨论】:

    【解决方案2】:

    引用数组必须进行运行时检查,因为它们的怪异行为允许静态不安全的隐式转换。您可以将String[] 分配给Object[] 并将Thread 存储到其中。如果在运行时未检查(它会抛出 ArrayStoreException),那么类型安全将被破坏,从而导致移动代码安全。

    泛型的复杂性导致了各种晦涩难懂的编译器错误。这些都是相对良性的,但如果让 JVM 来执行泛型,它们就会成为漏洞。事实证明,规范本身是不健全的。

    如果Object[] 是唯一的引用数组类型,Java 会是一种更好的语言。也会迫使 main 变得更明智。

    【讨论】:

      猜你喜欢
      • 2020-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-10
      • 1970-01-01
      • 2020-02-08
      • 2011-02-06
      • 2011-05-23
      相关资源
      最近更新 更多