关于尝试创建一系列泛型的人的堆栈溢出有很多问题:
ArrayList<Foo>[] poo = new ArrayList<Foo>[5];
答案当然是Java规范不允许您声明泛型数组。
我的问题是为什么?在java语言或java vm中,这种限制背后的技术原因是什么?这是我一直想知道的技术好奇心。
答案 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>
的实例。但这在运行时是不可能的,因为在运行时没有泛型信息。