为什么Java不允许创建通用数组?

时间:2010-06-07 20:13:39

标签: java arrays generics

关于尝试创建一系列泛型的人的堆栈溢出有很多问题:

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

答案当然是Java规范不允许您声明泛型数组。

我的问题是为什么?在java语言或java vm中,这种限制背后的技术原因是什么?这是我一直想知道的技术好奇心。

4 个答案:

答案 0 :(得分:13)

数组被定义 - 它们在运行时保留类型信息。

泛型是一个编译时构造 - 类型信息在运行时丢失。这是一个故意的决定,允许向后兼容pre-generics Java字节码。结果是您无法创建泛型类型的数组,因为在VM想要创建数组时,它将不知道要使用的类型。

答案 1 :(得分:5)

答案 2 :(得分:3)

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

请参阅Angelika Langer的Java Generics FAQ中的How do I generically create objects and arrays?获取解决方法(您可以使用反射来完成)。该FAQ包含您想要了解的Java泛型的所有内容。

答案 3 :(得分:0)

您被迫使用

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

将为您提供未经检查的警告。原因是泛型和Java数组的运行时类型检查行为存在潜在的类型安全问题,并且他们希望确保在编程时知道这一点。当您编写new ArrayList[...]时,您正在创建一些内容,它将在运行时检查放入其中的所有内容,以确保它是ArrayList的实例。遵循此方案,当您执行new ArrayList<Foo>[...]时,您希望创建一些在运行时检查所有内容的内容,以确保它是ArrayList<Foo>的实例。但这在运行时是不可能的,因为在运行时没有泛型信息。