问题描述
比如:Map<String, String>[] wp = new HashMap<String, String>[5];
会报错,无法编译通过
更新:目前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
http://cr.openjdk.java.net/~briangoetz/valhalla/specialization.html<- 这篇文档主要讨论的是原本Java泛型的设计取舍以及当前在实验中的改进思路。注意这篇文档里的“未来版本Java”的语法都是为了实现原型而随便选用的语法,不是经过彻底设计调整后的语法;请不要对原型的语法吐槽,语法是最表面最容易变的部分。
Java的reified generics目标是在Java 10推出。目前有原型可以玩:
OpenJDK: Project Valhalla