【发布时间】:2017-04-20 13:01:28
【问题描述】:
为什么集合类型检查只发生在编译时, 和数组类型在编译时和运行时检查。
【问题讨论】:
-
因为维度和内存分配。
-
可能是因为泛型在 Java 5 中以不破坏向后兼容性的方式侵入了该语言。
标签: java generics collections
为什么集合类型检查只发生在编译时, 和数组类型在编译时和运行时检查。
【问题讨论】:
标签: java generics collections
Java 使用类型擦除是因为正如@khelwood 在评论中指出的那样,泛型是事后才想到的,并在 1.5 中引入了该语言。
此外,运行时类型检查的计算量很大,因此在编译时处理检查以减少运行时检查的需要。
此外,正如 InjuredThePatient 在 cmets 中所指出的,您所看到的 ArrayLists 的“运行时类型检查”实际上是内存分配错误。
【讨论】:
引用数组必须进行运行时检查,因为它们的怪异行为允许静态不安全的隐式转换。您可以将String[] 分配给Object[] 并将Thread 存储到其中。如果在运行时未检查(它会抛出 ArrayStoreException),那么类型安全将被破坏,从而导致移动代码安全。
泛型的复杂性导致了各种晦涩难懂的编译器错误。这些都是相对良性的,但如果让 JVM 来执行泛型,它们就会成为漏洞。事实证明,规范本身是不健全的。
如果Object[] 是唯一的引用数组类型,Java 会是一种更好的语言。也会迫使 main 变得更明智。
【讨论】: