2010-06-07 97 views
19

有很多的人谁试图创建仿制药的这样一个数组的计算器问题:为什么Java不允许创建通用数组?

ArrayList<Foo>[] poo = new ArrayList<Foo>[5]; 

当然,答案是,Java规范不允许你声明数组仿制药。

但是我的问题是为什么? Java语言或Java虚拟机中的这种限制的技术原因是什么?这是我一直想知道的技术好奇心。

回答

13

数组已被通用 - 它们在运行时保留类型信息。

泛型是一个编译时构造 - 类型信息在运行时丢失。这是一个慎重的决定,允许向前兼容Java字节码的向后兼容性。结果是你不能创建一个泛型类型的数组,因为在VM想创建数组时,它不知道使用哪种类型。

3

这是一个古老的博客文章我写的,我解释这个问题:Java generics quirks

How do I generically create objects and arrays?从安格朗格的Java泛型常见问题的解决方法,(你可以使用反射这样做)。该FAQ包含了您想了解的有关Java泛型的所有信息。

+0

博客页面由我的前雇主主办,不再存在。 – Jesper 2014-06-26 09:24:07

0

你不得不使用

ArrayList<Foo>[] poo = new ArrayList[5]; 

,这将给你一个unchecked警告。原因是泛型和Java数组的运行时类型检查行为存在潜在的类型安全问题,并且他们希望在编程时确保知道这一点。当你编写new ArrayList[...]时,你正在创建一些东西,它会在运行时检查所有放入它的东西,以确保它是ArrayList的一个实例。按照这个方案,当你做new ArrayList<Foo>[...]时,那么你期望创建一些东西,在运行时检查所有放入它的东西,以确保它是一个ArrayList<Foo>的实例。但是这在运行时是不可能的,因为在运行时没有泛型信息。

相关问题