• (本文例子适用于JDK 5.0, 学习请先安装并配置!!!)  
  •       我们从一个简单的例子开始:假设我们现在需要一个专用来存储字符串的List,该如何实现?呵呵,这还不简单,且看如下代码:   
  • public static void main(String[] args)
  • {  
  •      List strList = new ArrayList();  
  •      strList.add("one");  
  •      strList.add("two");  
  • }  
  •    相信很多人都有过这样写的经历,不错,这个写法确实没有错。以前我们甚至都是这么做的。但是不是说要与时俱进么?这样的写法到今天来看,却就有问题了。问题来源于我们的需求,我们需要的是一个专门用来存储字符串的List,现在请在这段程序代码后面加一句,使之变成这样:  
  • public static void main(String[] args)
  • {  
  •      List strList = new ArrayList();  
  •      strList.add("one");  
  •      strList.add("two");  
  •      strList.add(new Integer(1));          
  • }  
  •        然后运行检查一下,可以运行!是个好消息,别高兴,问题就在于这个List能正常运行(记住:程序员要求的不是程序能运行)。回头看看,我们的需求是这个List专门用来存储字符串,但是现在,这个List竟然还可以存储一个整型数据。也许你会说,Java类库定义的不就是可以存储任意一个Object 么?是的,没错,但是现在我们的需求范围变小了,只需要存储字符串。别说我是钻牛角尖,我们看一个更普遍的问题:当我们操作数据库的时候,我们经常会返回一张表的所有数据,在我们通过实体关系映射之后,我们得到的就是一系列相同类型的数据,通常我们采取的操作是用一个List来保存这一系列的数据,但是由于这些数据都具有相同的类型,因此,这个List也就成了一个保存单一对象的List了。看到这里,我想对于我这个例子的目的大家应该清楚了。   
  •       现在我们来讨论一下问题的解决之道,一句话来总结就是我们需要一个只能操作单一类型的List。方法就在这里,Java 5给我们提供了解决之道-----Generic,对于我们的这个例子来说,Java5的类型安全要发挥作用了。  
  •       现在我们回到程序清单一,打开你的开发工具,编译一下(Eclipse等工具下面不用你自己变异就可以看到),我们发现程序虽然没有错误,但是却有一个警告:   
  • Type safety: The method add(Object) belongs to the raw type List.
  • References to generic type List should be parameterized
  •       看见了么, JavaTiger给你警告了,警告的来源就是上面所说的类型安全。如果你查询一下Javadoc,你会发现List 是这样定义的 :         
  • Public   interface List<E> extends Collection,Iterable
  •        注意这个<E>,它就是JavaTiger的类型安全标志,我想,到这里可以给出在保证类型安全时我们例子中的List应该如何定义了:         
  • List<String> strList = new ArrayList<String>();  
  •        在理解这条语句之前请先记住,以后这就是List的官方写法了(^_^)。现在来看一下,在List之后我们有<String>这样的标志,在JavaTiger里面,这就是类型安全的定义方法,结合这条语句,很容易就可以看出,我们定义了一个用来存储String类型的List。来看看重新定义后的效果:         
  • public static void main(String[] args)
  • {  
  •      List<String> strList = new ArrayList<String>();  
  •      strList.add("one");  
  •      strList.add("two");  
  • }  
  •        再编译一下或者直接在Eclipse里面观察,先前的警告没有了。  
  •        到此,应该说我们已经掌握了类型安全的基本用法了,现在我么来个小小的改变,将List 的定义改成这样:                   
  • List<String> strList = new ArrayList();  
  •       呵呵,警告又回来了。虽然我们在这里对List定义了String类型,但是我们在实例化的时候去却没有指定,因此出现了这个警告,所以记住上面讲的官方写法。
  •       现在回来,让我们来验证一下这个保证了类型安全的List是不是安全的。让我们还是通过向这个list 添加一个整型数据来验证:         
  • public static void main(String[] args)
  • {  
  •      List<String> strList = new ArrayList<String>();  
  •      strList.add("one");  
  •      strList.add("two");  
  •      strList.add( new Integer(1) );  
  • }         
  •        结果竟然出错了(这可不是警告啊!)    是不是很神奇?看一下出错的消息:   
  • The method add(String) in the type List is not applicable for the arguments (Integer)
  •        效果很明显,这个List的add方法已经只能接受String类型的参数了,Javadoc中的add( Object obj )方法已经不能用了,现在大家都应该很满意了吧,我们的需求达到了,这个List太安全了,呵呵。想想它带来的好处,以后当我们要处理一个List中间的元素时,再也不需要这么写了:         
  • String str = (String) list.get( i );         
  •        有了类型安全,我们可以直接书写:         
  • String str = list.get( i );         
  •       也许这还不以让你来满意,但是看这样一个方法吧:         
  • public List<String> getStrList( List<String> list )
  • {  
  •      .....  
  •      return XXX;  
  • }  
  •        这就是参数化类型的威力,别告诉我说你觉得这个方法没有什么特别的。  
  •        好了,我想我的目的应该已经达到了,大家应该明白Java5里面的类型安全是怎么回事以及如何运用了,好吧,为了让大家心里更有底,再写两行代码让大家看看:           
  • Map<Integer,String> myMap = new HashMap<Integer ,String>();  
  • Set<MyClass> set = new HashSet<MyClass>(0);  
  •        不用再举例了吧,这几个例子够直白了吧。  
  •        在本文结束的时候,让我们又回到程序清单一,先前不是有警告么?如果你是这样一个人,既不想用类型安全来消除警告,又不想要看到那个讨厌的Waining,你可以在main方法以前加上这么一句(如果你用IDE的话可以自动来完成): 
  • @SuppressWarnings("unchecked") 。
  • 使程序变成这样:         
  • @SuppressWarnings("unchecked")  
  • public static void main(String[] args)
  • {  
  •      List strList = new ArrayList();  
  •      strList.add("one");  
  •      strList.add("two");  
  •      strList.add( new Integer(1) );    
  • }  
  •        这下子我想就算你如此挑剔也应该满足了,既没有类型安全,也没有警告了。为什么?关键在于我们添加的那行语句,它也是 JavaTiger的新特性之一Annotation
  • java泛型问题 关于警告:XX is a raw type的更多相关文章

    1. eclipse中如何去除警告:Class is a raw type. References to generic type Class<T> should be parameterized

      转自:https://blog.csdn.net/zwr_1022/article/details/78583872 解决前的源代码: public class test {public static ...

    2. 【Java心得总结四】Java泛型下——万恶的擦除

      一.万恶的擦除 我在自己总结的[Java心得总结三]Java泛型上——初识泛型这篇博文中提到了Java中对泛型擦除的问题,考虑下面代码: import java.util.*; public clas ...

    3. 初识Java泛型以及桥接方法

      泛型的由来 在编写程序时,可能会有这样的需求:容器类,比如java中常见的list等.为了使容器可以保存多种类型的数据,需要编写多种容器类,每一个容器类中规定好了可以操作的数据类型.此时可能会有Int ...

    4. Java深度历险(五)——Java泛型

        作者 成富 发布于 2011年3月3日 | 注意:QCon全球软件开发大会(北京)2016年4月21-23日,了解更多详情!17 讨论 分享到:微博微信FacebookTwitter有道云笔记邮件 ...

    5. 黑马----JAVA泛型基础

      黑马程序员:Java培训.Android培训.iOS培训..Net培训 JAVA范型-基础 一.泛型的概念 1.实现了参数化类型 2.用于编写可应用于多种类型的代码,即所编写的代码可应用于许多许多的类 ...

    6. Java泛型-内部原理: 类型擦除以及类型擦除带来的问题

      一:Java泛型的实现方法:类型擦除 大家都知道,Java的泛型是伪泛型,这是因为Java在编译期间,所有的泛型信息都会被擦掉,正确理解泛型概念的首要前提是理解类型擦除.Java的泛型基本上都是在编译 ...

    7. Java泛型-类型擦除

      一.概述 Java泛型在使用过程有诸多的问题,如不存在List<String>.class, List<Integer>不能赋值给List<Number>(不可协变 ...

    8. java 深度探险 java 泛型

      Java泛型(generics)是JDK 5中引入的一个新特性,允许在定义类和接口的时候使用类型参数(type parameter).声明的类型参数在使用时用具体的类型来替换.泛型最主要的应用是在JD ...

    9. Java学习笔记(二一)——Java 泛型

      [前面的话] 最近脸好干,掉皮,需要买点化妆品了. Java泛型好好学习一下. [定义] 一.泛型的定义主要有以下两种: 在程序编码中一些包含类型参数的类型,也就是说泛型的参数只可以代表类,不能代表个 ...

    随机推荐

    1. hbase namespace问题

      如果遇到进入shell之后HMaster自动挂掉的问题,并且master的log里出现“TableExistsException: hbase:namespace”字样,很可能是更换了Hbase的版本 ...

    2. Repeater隔行变色,两个方式

      <table> <tr> <td>用户编号</td> </tr> <asp:Repeater ID="rptUser&quo ...

    3. Android Intent的花样启动

      刚开始看郭大神的<>,实现以下里面的一些例子.Intent的花样启动 显示Intent的使用. 实例化一个Intent,并且制定当前的activity和要跳转到的activity Inte ...

    4. 互联网大公司的CEO,多是程序员出身

      互联网有个现象,大公司的CEO,多是程序员出身.举例如下:------马化腾93年深大计算机系毕业,进入润迅通信从软件工程师做到开发部主管,98年11月与张志东等凑齐50万元注册腾讯公司,99年2月开 ...

    5. Android 测试工具集01

      Appium是一个支持原生,混合和移动web apps的开源的跨平台测试框架工具. ANDROID依赖 Android SDK API >= 17 (Additional features re ...

    6. Python学习笔记(四)Python函数的参数

      Python的函数除了正常使用的必选参数外,还可以使用默认参数.可变参数和关键字参数. 默认参数 基本使用 默认参数就是可以给特定的参数设置一个默认值,调用函数时,有默认值得参数可以不进行赋值,如: ...

    7. 初学swift笔记运算符(二)

      swift 中的运算符 import Foundation //字符类型 var char: Character = "a" char="b" println( ...

    8. List和Tuple类型

      list列表,list是一种有序的集合,可以随时添加和删除其中的元素,L=[]   索引从0开始,第一个元素的索引是0,第二个是1,倒数第一个是-1,倒数第二个是-2,以此类推,使用索引,不要越界   ...

    9. pycharm的激活

      ——————转———— Pycharm5注册方式   0x1 ,安装 0x2 , 调整时间到2038年. 0x3 ,申请30天试用 0x4, 退出pycharm 0x5, 时间调整回来. ##注册方法 ...

    10. Axure 快捷方式

      基本快捷键: 打开:Ctrl + O新建:Ctrl + N保存:Ctrl + S退出:Alt + F4打印:Ctrl + P查找:Ctrl + F替换:Ctrl + H复制:Ctrl + C剪切:Ct ...