`

JavaTiger(Java5.0) 新特性------类型安全

    博客分类:
  • Work
阅读更多
xml 代码
  1.      (本文例子适用于JDK 5.0, 学习请先安装并配置!!!)    
  2.   
  3.      我们从一个简单的例子开始:假设我们现在需要一个专用来存储字符串的List,该如何实现?呵呵,这还不简单,且看如下代码:    
  4. public static void main(String[] args) 
  5. {   
  6.     List strList = new ArrayList();   
  7.     strList.add("one");   
  8.     strList.add("two");    
  9. }   
  10.   
  11.     相信很多人都有过这样写的经历,不错,这个写法确实没有错。以前我们甚至都是这么做的。但是不是说要与时俱进么?这样的写法到今天来看,却就有问题了。问题来源于我们的需求,我们需要的是一个专门用来存储字符串的List,现在请在这段程序代码后面加一句,使之变成这样:   
  12.  
  13. public static void main(String[] args) 
  14. {   
  15.     List strList = new ArrayList();   
  16.     strList.add("one");   
  17.     strList.add("two");   
  18.     strList.add(new Integer(1));           
  19. }   
  20.   
  21.       然后运行检查一下,可以运行!是个好消息,别高兴,问题就在于这个List能正常运行(记住:程序员要求的不是程序能运行)。回头看看,我们的需求是这个List专门用来存储字符串,但是现在,这个List竟然还可以存储一个整型数据。也许你会说,Java类库定义的不就是可以存储任意一个Object么?是的,没错,但是现在我们的需求范围变小了,只需要存储字符串。别说我是钻牛角尖,我们看一个更普遍的问题:当我们操作数据库的时候,我们经常会返回一张表的所有数据,在我们通过实体关系映射之后,我们得到的就是一系列相同类型的数据,通常我们采取的操作是用一个List来保存这一系列的数据,但是由于这些数据都具有相同的类型,因此,这个List也就成了一个保存单一对象的List了。看到这里,我想对于我这个例子的目的大家应该清楚了。    
  22.  
  23.      现在我们来讨论一下问题的解决之道,一句话来总结就是我们需要一个只能操作单一类型的List。方法就在这里,Java 5给我们提供了解决之道-----Generic,对于我们的这个例子来说,Java5的类型安全要发挥作用了。    
  24.  
  25.      现在我们回到程序清单一,打开你的开发工具,编译一下(Eclipse等工具下面不用你自己变异就可以看到),我们发现程序虽然没有错误,但是却有一个警告:    
  26.  
  27.   Type safety: The method add(Object) belongs to the raw type List. 
  28.   References to generic type List should be parameterized   
  29.  
  30.      看见了么, JavaTiger给你警告了,警告的来源就是上面所说的类型安全。如果你查询一下Javadoc,你会发现List 是这样定义的 :          
  31. Public  interface List<E> extends Collection,Iterable     
  32.   
  33.       注意这个<E>,它就是JavaTiger的类型安全标志,我想,到这里可以给出在保证类型安全时我们例子中的List应该如何定义了:          
  34. List<String> strList = new ArrayList<String>();   
  35.       在理解这条语句之前请先记住,以后这就是List的官方写法了(^_^)。现在来看一下,在List之后我们有<String>这样的标志,在JavaTiger里面,这就是类型安全的定义方法,结合这条语句,很容易就可以看出,我们定义了一个用来存储String类型的List。来看看重新定义后的效果:          
  36. public static void main(String[] args) 
  37. {   
  38.     List<String> strList = new ArrayList<String>();   
  39.     strList.add("one");   
  40.     strList.add("two");    
  41. }   
  42.   
  43.       再编译一下或者直接在Eclipse里面观察,先前的警告没有了。    
  44.       到此,应该说我们已经掌握了类型安全的基本用法了,现在我么来个小小的改变,将List 的定义改成这样:                    
  45. List<String> strList = new ArrayList();   
  46.   
  47.      呵呵,警告又回来了。虽然我们在这里对List定义了String类型,但是我们在实例化的时候去却没有指定,因此出现了这个警告,所以记住上面讲的官方写法。
  48.     
  49.      现在回来,让我们来验证一下这个保证了类型安全的List是不是安全的。让我们还是通过向这个list 添加一个整型数据来验证:          
  50. public static void main(String[] args) 
  51. {   
  52.     List<String> strList = new ArrayList<String>();   
  53.     strList.add("one");   
  54.     strList.add("two");    
  55.     strList.add( new Integer(1) );   
  56. }          
  57.   
  58.       结果竟然出错了(这可不是警告啊!)   是不是很神奇?看一下出错的消息:    
  59.  
  60.  The method add(String) in the type List is not applicable for the arguments (Integer)
  61.   
  62.       效果很明显,这个List的add方法已经只能接受String类型的参数了,Javadoc中的add( Object obj )方法已经不能用了,现在大家都应该很满意了吧,我们的需求达到了,这个List太安全了,呵呵。想想它带来的好处,以后当我们要处理一个List中间的元素时,再也不需要这么写了:          
  63. String str = (String) list.get( i );          
  64.         
  65.       有了类型安全,我们可以直接书写:          
  66. String str = list.get( i );          
  67.   
  68.      也许这还不以让你来满意,但是看这样一个方法吧:          
  69. public List<String> getStrList( List<String> list )
  70. {   
  71.     .....   
  72.     return XXX;    
  73. }   
  74.  
  75.       这就是参数化类型的威力,别告诉我说你觉得这个方法没有什么特别的。    
  76.   
  77.       好了,我想我的目的应该已经达到了,大家应该明白Java5里面的类型安全是怎么回事以及如何运用了,好吧,为了让大家心里更有底,再写两行代码让大家看看:            
  78. Map<Integer,String> myMap = new HashMap<Integer ,String>();   
  79. Set<MyClass> set = new HashSet<MyClass>(0);   
  80.       不用再举例了吧,这几个例子够直白了吧。       
  81.   
  82.       在本文结束的时候,让我们又回到程序清单一,先前不是有警告么?如果你是这样一个人,既不想用类型安全来消除警告,又不想要看到那个讨厌的Waining,你可以在main方法以前加上这么一句(如果你用IDE的话可以自动来完成):  
  83. @SuppressWarnings("unchecked") 。
  84. 使程序变成这样:          
  85. @SuppressWarnings("unchecked")   
  86. public static void main(String[] args) 
  87. {   
  88.     List strList = new ArrayList();   
  89.     strList.add("one");   
  90.     strList.add("two");    
  91.     strList.add( new Integer(1) );     
  92. }   
  93.   
  94.       这下子我想就算你如此挑剔也应该满足了,既没有类型安全,也没有警告了。为什么?关键在于我们添加的那行语句,它也是 JavaTiger的新特性之一Annotation:至于它是怎么回事,请关注后续话题。    
分享到:
评论
3 楼 fengzhenda 2010-03-11  
谢了,解决了我的疑问。
2 楼 onwulc 2008-04-13  
感谢分享,解决了我的困惑
1 楼 咖啡舞者 2007-10-30  
很详细,学习了。

相关推荐

    JAVA 5.0 TIGER程序高手秘笈

    针对Java SDK5.0的新特性而出的一本书,O'relly出版社出版的经典!

    java学习笔记

    Java 是我最熟悉的程序语言,在这之前我已经撰写一些 J2SE 1.4.2 的心得文件,您可以在 这里 下载这些文件,2004年9月30日 Tiger/J2SE 5.0 已经公布,它有了一些大的变动与改进,这个分区将整理一些我在了解 J2SE ...

    Java B安装指导及推荐教程

    JDK目前最新的版本為代號為Tiger的JDK 5.0版(JDK 1.5),自JDK1.2版之後的JDK工具組,由於相較於先前的版本增加了許多新的特性,因此冠上Java 2的字眼,稱為J2SDK(Java 2 SDK,Java 2 Software Development Kit),而...

    JSR-133-JMM.zip

    本规范是JSR-176(定义了JavaTM平台 Tiger(5.0)发布版的主要特性)的一部分。本规范的标准内容将合并到JavaTM语言规范、JavaTM虚拟机规范以及java.lang包的类说明中。本JSR-133规范将不再通过JCP维护和修改。未来...

    JSR-133-ZH.pdf

    本规范是JSR-176(定义了JavaTM平台 Tiger(5.0)发布版的主要特性)的一部分。本规范的标准内容将合并到JavaTM语言规范、JavaTM虚拟机规范以及java.lang包的类说明中。本JSR-133规范将不再通过JCP维护和修改。未来...

    Eclipse3.1中体验J2SE5.0之枚举类型

    J2SE5.0(Tiger)的发布是Java语言发展史上的一个重要的里程碑,是迄今为止在Java编程方面所取得的最大进步.J2SE5.0提供了很多令人激动的特性.这些特性包括范型(generics)的支持,枚举类型(enumeration)的支持,元数据...

    JSR133中文版.pdf

    本规范是JSR-176(定义了JavaTM平台 Tiger(5.0)发布版的主要特性)的一部分。本规范的标准内容将合并到JavaTM语言规范、JavaTM虚拟机规范以及java.lang包的类说明中。本JSR-133规范将不再通过JCP维护和修改。未来...

    Java/JavaEE 学习笔记

    第一章 Java5.0新特性.......................94 第二章 基础知识.....96 第三章 泛型...........101 第四章 Annotation.102 XML学习笔记...............106 XML前言...............106 第一章 XML Overview..........

    Tiger核心库简介

    摘要:Java之所以得到很多程序员的青睐,除了她的严谨的面向对象特性外,还有一个不容轻视的因素,那...一门语言如果没有库,功能将会大打折扣,在JDK5.0版本中,其核心库也有了诸多的改进,本文将就其新特性进行简介。

    Spring-Reference_zh_CN(Spring中文参考手册)

    2.6.4. 对Java 5(Tiger)的支持 2.7. 移植到Spring 2.0 2.7.1. 一些变化 2.7.1.1. Jar包 2.7.1.2. XML配置 2.7.1.3. Deprecated的类和方法 2.7.1.4. Apache OJB 2.7.1.5. iBatis 2.8. 更新的样例应用 2.9. 改进的...

    spring chm文档

    2.6.4. 对Java 5(Tiger)的支持 2.7. 移植到Spring 2.0 2.7.1. 一些变化 2.8. 更新的样例应用 2.9. 改进的文档 I. 核心技术 3. 控制反转容器 3.1. 简介 3.2. 容器和bean的基本原理 3.2.1. 容器 3.2.2. ...

    Spring API

    2.6.6. 对Java 5 (Tiger) 支持 2.7. 移植到Spring 2.5 2.7.1. 改变 2.8. 更新的样例应用 2.9. 改进的文档 I. 核心技术 3. IoC(控制反转)容器 3.1. 简介 3.2. 基本原理 - 容器和bean 3.2.1. 容器 3.2.2. ...

    Spring中文帮助文档

    2.6.6. 对Java 5 (Tiger) 支持 2.7. 移植到Spring 2.5 2.7.1. 改变 2.8. 更新的样例应用 2.9. 改进的文档 I. 核心技术 3. IoC(控制反转)容器 3.1. 简介 3.2. 基本原理 - 容器和bean 3.2.1. 容器 3.2.2. ...

    Spring 2.0 开发参考手册

    2.6.4. 对Java 5(Tiger)的支持 2.7. 移植到Spring 2.0 2.7.1. 一些变化 2.8. 更新的样例应用 2.9. 改进的文档 I. 核心技术 3. 控制反转容器 3.1. 简介 3.2. 容器和bean的基本原理 3.2.1. 容器 3.2.2. ...

    J2EE学习笔记(J2ee初学者必备手册)

    第一章 Java5.0新特性.......................94 第二章 基础知识.....96 第三章 泛型...........101 第四章 Annotation.102 XML学习笔记...............106 XML前言...............106 JavaEE@xuxiang 2 Java/...

Global site tag (gtag.js) - Google Analytics