Java1.5引入的泛型是一个比较大的进步,让人用的也很爽.但是java的泛型是基于类型擦除,也就是只在编译期才有泛型的存在,在运行时根本没有泛型什么事. 这也造成了泛型不能支持下面这些情况,而这些是在C++里面是都得到了支持的.
- 不支持New操作
- class SomeContainer<E>
- {
- E createContents()
- {
- return new E();
- }
- }
分析: 因为是类型擦除的,如果支持的话,这里只能new 一个真正Object对象了, 如果在调用处java隐含的强制转型,肯定会抛出错误.
如果你是想生成一个泛型对应的对象,可以用下面的这种办法. 这种办法传入了对应的Class对象,通过反射找到对应的默认构造函数去生成的对象,所以可以完成上面没办法完成的.
- private static class SomeContainer<E>
- {
- E createContents(Class<E> clazz)
- {
- return clazz.newInstance();
- }
- }
- 不支持静态成员变量
- public class StaticMember<T> {
- static T member;
- }
分析:因为static变量会被所有实例共享,如果泛型支持多种类型的时候,强制转换类型肯定会抛出异常.
- 不支持直接New泛型相关的数组
- public class GenericArray<T> {
- // this one is fine①
- public T[] notYetInstantiatedArray;
- // causes compiler error②
- public T[] array = new T[5];
- // causes compiler errorshan③
- List<String>[] lsa = new List<String>[10];
- }
②处不被支持很好理解,泛型类型都不支持new, 泛型数组肯定也不行了.
③处不被支持我没理解顺畅, 下面链接处说如果支持会可能抛出异常这个违背了泛型的原则.但是使用通配符泛型数组也会抛出异常.
http://docs.oracle.com/javase/tutorial/extra/generics/fineprint.html