`
flyfoxs
  • 浏览: 294249 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

古怪的泛型

 
阅读更多

Java1.5引入的泛型是一个比较大的进步,让人用的也很爽.但是java的泛型是基于类型擦除,也就是只在编译期才有泛型的存在,在运行时根本没有泛型什么事. 这也造成了泛型不能支持下面这些情况,而这些是在C++里面是都得到了支持的.

 

  • 不支持New操作 
Java代码 
  1. class SomeContainer<E>  
  2. {  
  3.     E createContents()  
  4.     {  
  5.         return new E();  
  6.     }  
  7. }  

 

分析: 因为是类型擦除的,如果支持的话,这里只能new 一个真正Object对象了, 如果在调用处java隐含的强制转型,肯定会抛出错误.

 

如果你是想生成一个泛型对应的对象,可以用下面的这种办法. 这种办法传入了对应的Class对象,通过反射找到对应的默认构造函数去生成的对象,所以可以完成上面没办法完成的.

 

Java代码 
  1. private static class SomeContainer<E>  
  2. {  
  3.     E createContents(Class<E> clazz)  
  4.     {  
  5.         return clazz.newInstance();  
  6.     }  
  7. }  

 

 

 

  • 不支持静态成员变量
Java代码 
  1. public class StaticMember<T> {  
  2.     static T member;  
  3. }  

 分析:因为static变量会被所有实例共享,如果泛型支持多种类型的时候,强制转换类型肯定会抛出异常.

 

 

  • 不支持直接New泛型相关的数组
Java代码 
  1. public class GenericArray<T> {  
  2.     // this one is fine①  
  3.     public T[] notYetInstantiatedArray;  
  4.    
  5.     // causes compiler error②  
  6.     public T[] array = new T[5];  
  7.       
  8.     // causes compiler errorshan③  
  9.     List<String>[] lsa = new List<String>[10];  
  10. }  

 

 ②处不被支持很好理解,泛型类型都不支持new, 泛型数组肯定也不行了. 

 ③处不被支持我没理解顺畅, 下面链接处说如果支持会可能抛出异常这个违背了泛型的原则.但是使用通配符泛型数组也会抛出异常. 

http://docs.oracle.com/javase/tutorial/extra/generics/fineprint.html

 

0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics