繁体   English   中英

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

[英]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想要创建数组时,它将不知道要使用的类型。

这是我写的一篇旧博客文章,我解释了这个问题: 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM