java为什么不支持泛型数组?

比如: Map<String, String>[] wp = new HashMap<String, String>[5]; 会报错,无法编译通过
关注者
274
被浏览
117,330

13 个回答

更新:目前Project Valhalla的Model 3方案里,如果泛型类型参数T是原始类型(没错,T可以是原始类型了!),那么new T[size]就是可以支持的;如果T是引用类型则跟Java 5开始的规定一样,还是不能new T[size]。

至于为什么这么设计,那还是得追溯到擦除法实现泛型。这是Java 5的时候为了最大限度兼容老的API(特别是collections API),以及减少对VM的修改而做的设计。

=============== 以下2015-02-18原答案 ===============

题主的疑问和Java未来的发展方向都在下面链接的文档里有详尽描述,包括:

You can instantiate an array of T with new T[size] . The behavior of this is to instantiate an Object[] when T is instantiated with a reference type and the correct value array when T is specialized to a value type.

文档:

State of the Specialization, December 2014: Proto Edition

cr.openjdk.java.net/~br

<- 这篇文档主要讨论的是原本Java泛型的设计取舍以及当前在实验中的改进思路。注意这篇文档里的“未来版本Java”的语法都是为了实现原型而随便选用的语法,不是经过彻底设计调整后的语法;请不要对原型的语法吐槽,语法是最表面最容易变的部分。

Java的reified generics目标是在Java 10推出。目前有原型可以玩:

OpenJDK: Project Valhalla