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

时间:2017-04-20 13:01:28

标签: java generics collections

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

2 个答案:

答案 0 :(得分:0)

Java使用类型擦除,因为正如@khelwood泛型的评论所指出的那样是经过深思熟虑并在1.5中引入语言。

此外,运行时类型检查在计算上非常昂贵,因此在编译时处理检查以减少在运行时检查的需要。

另外,正如InjuredThePatient在评论中所指出的,你所看到的是"运行时类型检查" ArrayList s实际上是内存分配错误。

答案 1 :(得分:0)

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

泛型的复杂性导致了各种模糊的编译器错误。这些是相对良性的,但如果遗嘱留给JVM强制执行,那么它们就是漏洞。事实证明,规范本身并不健全。

如果Object[]是唯一的参考数组类型,那么Java本来是一种更好的语言。也会迫使main变得更加明智。