Java泛型的研究与应用

来源 :硅谷 | 被引量 : 0次 | 上传用户:szlsh88
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  [摘要]Java编程中,在遇到对象存取问题时,传统方法采用以Object类为中介,进行类型转换,导致代码可读性差,并常常导致出现运行时的转型异常,且该类错误很难在编译期被发现。采用Java的泛型机制,可以极大的提高程序的可读性与安全性,使程序得以正常运行。
  [关键词]Java 泛型 转型
  中图分类号:TP3文献标识码:A 文章编号:1671-7597 (2008) 0210022-02
  
  Java中的泛型是JDK1.5的新特性,在1.5及以后的版本中被支持。在Java编程中,常常用到在容器中存放对象或从容器中取出对象,并根据实际情况转型为相应的对象,但在转型过程中极易出现错误,且很难发现。而使用泛型则可以在存取对象时明确指名对象的类型,将问题暴露在编译阶段,由编译器检测,从而避免Java在运行时出现转型异常,增加程序的可读性与稳定性,提高程序的运行效率。
  下面将通过实例阐述传统方法与Java泛型各自的使用方法与特点,并可以将这里介绍的泛型使用方法直接用于各种实际应用。
  一、传统方法的弊端
  在Java编程中,经常遇到众多对象的存取情况,比如在一个新闻系统中(假定新闻类为News),当从数据库中(即模型层)查询到某些新闻时,首先进行对象关系映射,也就是将每条新闻记录转变为一个News对象,然后再将News对象放入一个容器,在视图层显示时,从容器中将他们(News对象)一一取出,然后在视图层予以显示。
  这个过程中,传统的处理方法是首先将News类作为Object类放入相应容器,读取时在再将容器中的每个对象(此时为Object类型)转型为对应的News类,然后进行相应的处理。
  为了简单起见,我们用下面的代码来模拟上述过程。
  import java.util.HashMap;
  import java.util.Map;
  public class Test {
   public static void main(String[] args) {
   Map m=new HashMap();
   m.put(new Integer(1), new News("news1"));
   m.put(new Integer(2), new String("news2"));
   int i=0;
   while(i   News s=(News) m.get(new Integer(i+1));
   System.out.println(s);
   i++;
   }
   }
  }
  class News {
   String title;
   public News(String title){
   this.title=title;
   }
   public String toString(){
   return title;
   }
  }
  上述的处理过程很明了,但实际上隐含了一个错误,在程序的输出语句中,为了使用News类的方法,需要将对象强制转型为News类型,这个转型在编译阶段不会出现任何问题,但在运行时,却抛出ClassCastException转型异常,从而造成程序的异常终止。另外此程序的可读性也不好,因为我们在使用map容器取对象时,根本不知道其中存放的是什么对象。
  在JDK1.4之前,在处理相似的问题时,别无他法,只能这样来处理,至于运行时异常,只能靠我们写程序时小心。
  二、利用泛型解决上述问题
  Java的泛型就是在定义的同时明确指名其类型,增强程序的可读性。同时类型的检查在编译阶段就可以完成,避免运行时的异常,从而使程序有更强的健壮性。
  泛型的定义形式为:class Java_Generics<K,V>,这里边的K和V就像方法中的参数一样,代表类型。
  在Java的类库中,使用变量E表示集合的元素类型,K和V分别表示关键字与值的类型。T(需要时还可以用临近的字母U和S)可以表示任意类型。
  现在利用泛型来重写Test类中的main函数的部分关键代码,News类不变,更改如下:
   Map m=new HashMap();
   m.put(new Integer(1), new News("news1"));
   M.put(new Integer(2), new News("news2"));
   // m.put(new Integer(3), new String("news3"));
   int i=0;
   while(i   News s= m.get(new Integer(i+1));
   System.out.println(s);
   i++;
   }
  这段代码必须在JDK1.5或更高的版本上才能正确编译,注释掉的那行代码就是前面出现ClassCastException错误的原因。之所以被注释掉,是因为他在编译阶段就被发现了问题,必须做相应更改才能通过编译,提高了程序的健壮性。另外,当我们看到Map的定义的时候,很清楚能向Map中放入什么类型的对象,程序的可读性也大大增强。
  基于上述示例的泛型应用在Java编程中的应用极为广泛,但都可以利用上述示例来方便的解决问题。在实际应用中,从容器中读出所有元素时,也可以利用Iterator指定。比如在一个List
  容器中,把List转换为Iterator:Iterator it = list.iterator();这是可以使用泛型的另外一个地方。
  三、泛型使用应注意的问题
  究竟什么类可以指定特定的对象,使用泛型呢?最简单有效的方法是查阅JDK的API帮助文档,凡是后面有等尖括号的,就可以指定明确的类型
  另外,在使用泛型编程时还要注意以下几点:
  (1)不可以用一个基本类型(如int float)来替换泛型。
  (2)泛型类不可以继承Exception类。
  (3)不可以定义泛型数组。
  (4)不可以用泛型构造对象,即:News news = new T(); 是错误的。
  (5)在static方法中不可以使用泛型,泛型变量也不可以用static关键字来修饰。
  总之,在 Java 语言中使用泛型,会大大增强程序的易读性和健壮性,把隐含错误消除在编译阶段。学习如何使用泛型类型相当简单,但是同样也需要防范一些可能出现的错误。
  
  参考文献:
  [1](美)Cay S.Horstmann,Gary Cornell,叶乃文等译.JAVA 2核心技术机械工业出版社,2006.
  [2](美)埃克尔著,陈昊鹏译,Java编程思想(第4版) 机械工业出版社2007.6.
  
  作者简介:
  李 森(1980-),男,河南南阳,在职研究生,助理讲师,主要从事Java和计算机网络方面研究。
  
  注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。
其他文献
双鱼座  幸运指数:★★★★★  吉日: 5/27  霉日: 6/3  幸运色: 玫瑰粉  幸运数字: 18  开运一句话:在对的时间,跟着感觉走  多利用小清新的姿态,很容易得到上位者的倾囊相授,蛰伏已久的工作有望获得突破,有得必有失,一碗水端不平的话就注意避重就轻喽!会在有感觉的地方碰上很有感觉的异性,两人都有感觉的话这感觉就对了。  白羊座  幸运指数:★★☆☆☆  吉日: 5/22  霉日
期刊
一、MPI简介  (1)MPI是一个库而不是一门语言,它可以被FORTRAN77/C/Fortran  90/C++调用,从语法上说它遵守所有对库函数调用的规则。  (2)MPI是一种标准或规范的代表,而不特指某一个对它的具体实现。迄今为止所有的并行计算机制造商都提供对MPI的支持,可以在网上免费得到MPI在不同并行计算机上的实现,一个正确的MPI程序可以不加修改地在所有的并行机上运行。  (3)
期刊
[摘要]在对贵州电网生产安全隐患进行危险性评价的基础上,比照生产实际,对LEC方法只能半定量评价的局限性提出了利用查评诊断改进的方法,使LEC法能够适应生产实际的风险评价需要。  [关键词]LEC法 电力生产安全隐患 半定量  中图分类号:TM7文献标识码:A 文章编号:1671-7597(2008)0210005-01    一、LEC方法在贵州电网公司电力生产运行现场工作安全隐患评价中的局限性
期刊
[摘要]由于新疆地处亚欧大陆腹地,气候干燥少雨,水资源极其有限,在国家能源开始战略西移和新疆将建成国家级棉、粮、畜重要生产基地的大发展形势下,科学而合理地利用水资源,就显得尤为重要。近年来新疆地区的天然雪资源比起以前减少了很多。面对这样的情况,新疆的农作物特别是棉花的节水灌溉显得尤为重要。  [关键词]政策 现状 应用 发展  中图分类号:TV93 文献标识码:B 文章编号:1671-7597 (
期刊
年轻时为了事业打拼,错过了生育的最好年龄,功成名就后才发现要个孩子是件多么奢侈的事……遍试各种方法无果,别忘了,还有绝地逢生的最后一招——试管婴儿。到今天为止,数以百万计的宝宝已经通过这种方式降临人间。虽然这项技术已日臻成熟,但不可否认的是,种种猜疑仍铺天盖地,比如,“试管婴儿”算不算自己亲生的?他长大后和其他孩子会不一样吗?如果你有同样的疑惑,不妨看看下文。  为“试管宝宝”正名  坊间流传着关
期刊
再见赵薇 再见青春  一个故事的开头,如果是“从前……”,那应该是虚构的童话或神话;而一个陈述句的开始,如果是“在我年轻的时候……”毫无疑问,这是一个令人忧伤的写实故事。赵薇的《致我们终将逝去的青春》,讲述的就是这样一个主题:从青年变中年——天底下还有比这更悲哀的事情吗?  而这样一个悲哀的主题由赵薇来讲述,更是一件颇有意味的事情。她的“小燕子”就是掠过我们青春期最亮丽的那抹剪影,说她是一代人的青
期刊
[摘要]随着高等教育的不断普及以及学生规模的不断扩大,为了完善实验教学条件,提供远程教育、继续教育等模式的远程实验应用而生。介绍的是一个以提供理工科电类实验为目标的远程综合实验室,所有实验都基于真实的物理对象,它允许多个用户同时登录、多个实验同时进行,用户无论在何时何地都可以进行同步模式或者异步模式实验。  [关键词]虚拟实验室 网络 Java小应用程序  中图分类号:TP3 文献标识码:A文章编
期刊
[摘要]叙述 Java语言的出现背景、主要特点、发展历程以及Java技术的应用,指出 Java 是当今IT产业和人类文明的创新和希望。  [关键词]Java 语言 技术  中图分类号:TP3文献标识码:A 文章编号:1671-7597 (2008) 0210021-01    一、Java语言的出现  自从1946年世界上第一台电子计算机问世以来,计算模式的发展经历了三个阶段:集中计算模式、分散计
期刊
[摘要]介绍基于MVC模式的成绩管理系统,解释MVC模式,阐述系统的功能模块、突出特点和应用前景。  [关键词]MVC 成绩管理系统  中图分类号:TP3 文献标识码:A文章编号:1671-7597 (2008) 0210030-02    一、引言  近年来,网络技术的日益普及推动了学校信息化的加速发展,使高校教学与管理的模式逐步由传统的面对面、人工作业过渡到基于网络的教学管理平台。考虑到英语教
期刊
[摘要]J2EE体系结构提供中间层集成框架用来满足无需太多费用而又需要高可用性、高可靠性以及可扩展性的应用的需求。通过提供统一的开发平台,J2EE降低了开发多层应用的费用和复杂性,同时提供对现有应用程序集成强有力支持,完全支持Enterprise JavaBeans,有良好的向导支持打包和部署应用,添加目录支持,增强了安全机制,提高了性能。  [关键词]J2EE 结构 优势  中图分类号:TP3
期刊