[英]Why doesn't Java allow for the creation of generic arrays?
尝试创建泛型数组的人有很多关于stackoverflow的问题,如下所示:
ArrayList<Foo>[] poo = new ArrayList<Foo>[5];
答案当然是Java规范不允许您声明泛型数组。
我的问题是为什么 ? 在java语言或java vm中,这种限制背后的技术原因是什么? 这是我一直想知道的技术好奇心。
数组是有效的 - 它们在运行时保留类型信息。
泛型是一个编译时构造 - 类型信息在运行时丢失。 这是一个故意的决定,允许向后兼容pre-generics Java字节码。 结果是您无法创建泛型类型的数组,因为在VM想要创建数组时,它将不知道要使用的类型。
请参阅Effective Java,第25项 。
这是我写的一篇旧博客文章,我解释了这个问题: Java泛型怪癖
请参阅如何一般创建对象和数组? 来自Angelika Langer的Java Generics FAQ的解决方法(你可以使用反射来完成)。 该FAQ包含您想要了解的Java泛型的所有内容。
你被迫使用
ArrayList<Foo>[] poo = new ArrayList[5];
这会给你一个未经检查的警告。 原因是泛型和Java数组的运行时类型检查行为存在潜在的类型安全问题,并且他们希望确保在编程时知道这一点。 当你编写new ArrayList[...]
,你正在创建一些东西,它会在运行时检查放入它的所有东西,以确保它是ArrayList
一个实例。 按照这个方案,当你执行new ArrayList<Foo>[...]
,你希望创建一些东西,在运行时检查所有放入它的东西,以确保它是ArrayList<Foo>
一个实例。 但是这在运行时是不可能的,因为在运行时没有泛型信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.