`
wqh
  • 浏览: 10944 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论

Java5范型研究

    博客分类:
  • JAVA
阅读更多

1、  java 范型的实现原理: Java 语言中的泛型基本上完全在编译器中实现,由编译器执行类型检查和类型推断,然后生成普通的非泛型的字节码。这种实现技术称为擦除( erasure )(编译器使用泛型类型信息保证类型安全,然后在生成字节码之前将其清除),所以说其实 java 的所谓的范型知识形式上的,仅仅是在编译期做了手脚,生成了一些标明范型的变量,应为这些都是编译期的行为,那么引用 buaawhl 的一句话就是说: java 只能支持 Field, Method generic type 信息,这些信息存放在 class 文件的 contant pool 中,作为字符串常量出现,标志是 signature

2、  由于 Java 范型的实现采用的是 Erasure 方式,仅仅是在编译期进行检查,所以在运行过程中我们就不能进行范型的实例化,因为我们不知道到底要实例化什么类型的对象,与原来我们手动进行强制类型转换的一样,我们如果知道我们能够转换成什么对象,那么我们就可以将我们知道的类型的信息传递过去,也就是吧 XX.class 传递过去,这样 jvm 就知道我们要实例化什么样的对象了。
 

3、  原来 Class<T> 表示的是一个范型的 Class 类啊,为什么搞的像 List<T> 样式的范型声明呢?搞得我迷糊了好长时间,一致以为是一个类似容器的东西呢,这个语法感觉到有些奇怪,见笑了:),这个类一般用来接受 XX.class 返回的对象。

4、  要想在 java 中范型用得爽,还得配合使用反射才行啊。由于 Java 采用了擦拭法进行范型的支持,所以我们依旧不能在运行期获取到具体的类型的信息,而至能够在我们进行设计的时候对其类型信息进行指定,那么我们指定的类型的信息就可以存放在编译后生成的 class 文件中了,我们可以通过反射来获取到具体的存放的信息,要获取到动态的传入的信息就不行了。


如下所示:

定义一个超类:
 

 

1 public   class  SuperClass < extends  Number >  
2 }
 
3

 

再定义一个子类: <!----> <o:p> </o:p>

<o:p> </o:p>

import  java.lang.reflect.ParameterizedType; 

  

public   class  MyTest < T >   extends  SuperClass < Integer >  

    
private  Class clazz  =   null  ; 

    
public   void  printClassInf()

       System. out .println( 
this  .getClass().getName()); 

       System. out .println( 
this  .getClass().getTypeParameters()[ 0 ].getName()); 

       System. out .println( 
this  .getClass().getSuperclass().getTypeParameters()[ 0 ].getName()); 

       clazz 
= (Class) ((ParameterizedType)  this  .getClass().getGenericSuperclass()).getActualTypeArguments()[ 0 ]; 

       String out 
=  clazz .getName(); 

       System. out .println(out); 

    }
 

    
public   static   void  main(String[] args)

       MyTest test 
=   new  MyTest < > (); 

       test.printClassInf(); 

    }
 

}
 

 


那么我们只能够获得我们实现定义好的要传入到
SuperClass 类中的 Integer 类型的范型信息,而不能得到我们在程序中传入的 类的类型信息,因为 java 范型的信息不记录的实例中,仅仅在类中进行了记录(这点感觉 java 的范型还不够成熟,可能因为要向后兼容等原因吧)。

<o:p> </o:p>

参考资料:

http://www.duduwolf.com/wiki/2006/51.html

http://calvin.iteye.com/blog/33139    白衣的 SpringSide 中对范型使用的说明

http://www-128.ibm.com/developerworks/cn/java/j-jtp01255.html   Java 理论和实践关于范型的讲解

http://www.nirvanastudio.org/java/dont-repeat-the-dao.html   范型实现可重用 DAO 的文章

http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/lang/reflect/ParameterizedType.html#getActualTypeArguments()

http://buaawhl.iteye.com/blog/22020   范型的实现原理,讲的比较清楚

<o:p> </o:p>

分享到:
评论

相关推荐

    Thinking in java4(中文高清版)-java的'圣经'

    1.8 单根继承结构 1.9 容器 1.9.1 参数化类型(范型) 1.10 对象的创建和生命期 1.11 异常处理:处理错误 1.12 并发编程 1.13 Java与Internet 1.13.1 Web是什么 1.13.2 客户端编程 1.13.3 服务器端编程 1.22 总结 第...

    Genetic Programming范型编程

    ### Genetic Programming范型编程 #### 一、引言与概览 遗传编程(Genetic Programming, GP)是一种基于自然选择原理的自动编程方法,它属于进化计算领域的一部分。该技术利用了生物进化的机制来自动地创建计算机...

    论文研究-基于Java的迁移工作流管理系统原型的实现研究.pdf

    迁移工作流范型是近年来工作流研究的新方向。根据迁移工作流管理系统框架,以移动Agent技术为基础,采用Java为开发语言,开发了迁移工作流管理系统原型Migflow。描述了Migflow的内部结构,给出了实现方案,并对迁移...

    java面向对象代码实例

    面向对象编程(Object-Oriented Programming,简称OOP)是一种程序设计范型,它将现实世界中的事物抽象为程序中的对象,通过对象之间的交互来实现程序的功能。在Java中,面向对象主要体现在类、对象、封装、继承和...

    软件重构方法的研究(吉林大学博士学位论文)

    吉林大学博士学位论文 关键词:软件重构方法;软件维护;程序转换;行为保留;程序结构改善;...Java语言接口;面向方面范型;横切关注点;方面挖掘; 静态模型;动态模型;逆向软件工程;对象状态模型.

    论文研究-网格GIS及其实现技术.pdf

    综上所述,网格GIS的研究涉及了GIS体系结构设计、Java网络通信、XML文档处理、空间数据库设计等多个IT领域知识。它的实现需要综合利用各种技术,包括但不限于Java编程、XML技术、数据库技术、网络通信协议等,从而...

    JXTA技术手册/奥克斯(Oaks,s.),切 中文 高清版

    在2001年2月,Sun公司宣布了Java网络技术中的一种创新性的范型:JXTA。倡导者是BillJoy,他是Sun公司的主要技术革新者。JXTA提供了一种革命性的框架,允许Java程序员利用新的点对点(P2P)网络协议,勿须考虑底层的...

    分布式对象模型应用技术研究.pdf

    本文主要探讨了分布式计算的十大范型中的分布式对象模型,以及在此模型下的一些关键技术,如远程方法调用(RMI)、对象请求代理(ORB)和构件技术。 远程方法调用(RMI)是Java平台上的一个重要特性,它使得一个...

    编程思想下篇

    1.9.1 参数化类型(范型) 1.10 对象的创建和生命期 1.11 异常处理:处理错误 1.12 并发编程 1.13 Java与Internet 1.13.1 Web是什么 1.13.2 客户端编程 1.13.3 服务器端编程 1.22 总结 第2章 一切都是对象 2.1 用...

    《JavaScript语言精髓与编程实践》精选版--动态函数式语言精粹

    尤其在使用JavaScript的开发者群体里,深入了解该语言的本来就不多,研究语言特性的就更少了。 《JavaScript语言精髓与编程实践》精选版从JavaScript 无关的角度综论这些语言的产生发展,以及特性的概要。作为纯...

    分布式原理与源码

    在《分布式系统原理与范型》这本书中,作者可能详细介绍了分布式系统的特征,如透明性、一致性、容错性、可扩展性和性能优化等。这些特性对于理解分布式系统的设计目标至关重要。 分布式系统的核心概念包括数据复制...

    《JavaScript语言精髓与编程实践》精选版

    尤其在使用JavaScript的开发者群体里,深入了解该语言的本来就不多,研究语言特性的就更少了。 本迷你书摘引了《JavaScript语言精髓与编程实践》一书有关语言讨论的关键章节(主要在第三、四、五章),从JavaScript...

    基于项目的软件工程:面向对象方法

    本书不依赖于具体的程序设计语言(必要的代码示例用Java给出),并采用统一建模语言(UML)的子集来为软件建模,解释学生工作中需要用到的符号。 本书为学生而写,可作为计算机专业本科生、非计算机专业研究生的软件...

    编译原理课件导论--总体编译过程介绍

    5. **程序设计语言范型**: 不同的程序设计语言有不同的范型,如面向过程、面向对象、函数式和声明式等。这些范型反映了不同的编程思想和设计模式,影响着编译程序的实现方式和优化策略。 6. **编译程序的意义**:...

    Curl IDE6.0

    CurlCurl是由美国国防部高级研究项目代理资助,马萨诸塞州科技学院的David A. Kranz开发的Web开发语言, HTML语言的创建者Tim Berners-Lee也参与其中,并扮演了重要的角色。  Curl语言是一种编程语言,它被设计...

    WEKA进行数据挖掘

    这是80/20范型的一个很好的例子——甚至更进一步可以是90/10范型。您用所谓的数据挖掘专家的10%的专业知识就能创建具有90%效力的数据挖掘模型。而为了补上模型剩下的10%的效力并创建一个完美的模型将需要90%额外的...

    计算机网络自顶向下

    书中强调了应用层的范型和编程接口,帮助读者在实际中能够快速学习和实现各种应用程序中的协议。随后,通过自顶向下的方法分析网络体系结构,让读者能够专注于网络所提供的服务内容,而不是仅仅停留在网络协议的抽象...

    无涯教程(LearnFk)-D编程教程离线版.pdf

    D语言起源于C++,但并非C++的简单扩展或变种,它重新设计了C++的特性并吸收了Java、C#、Eiffel等其他语言的元素。D语言由沃尔特·布莱特(Walter Bright)和安德烈·亚历山德雷斯库(Andrei Alexandrescu)共同开发...

Global site tag (gtag.js) - Google Analytics