A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 广驰 中级黑马   /  2012-9-4 17:23  /  1788 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 应广驰 于 2012-9-8 00:15 编辑

今天看了泛型方法的视频,老师在这里也没有很详细的描述,所以对泛型方法了解很少,好像除了不用功能和参数定义成Object差不多,基本上除了不需要类型转换就没其他功能了,也许是我没发现,那位能给我讲解一下泛型类还有其他什么作用和好处吗

3 个回复

倒序浏览
泛型
        (1)不确定的类型,广泛的类型。
        (2)基本格式:<数据类型> 注意了:数据类型必须是引用数据类型
        (3)泛型的定义方式
                A:泛型定义在类上
                        class Demo<QQ>
                        {
                                public void show(QQ qq){}
                        }

                B:泛型定义在方法上
                        class Demo
                        {
                                public <BM> void show(BM bm){}
                        }

                C:泛型定义在接口上
                        interface Inter<QQ>
                        {
                                public abstrace void show(QQ qq);
                        }

        (4)泛型的使用
                A:一般,泛型就用于集合类中。
               
                B:好处:
                        **把运行过程中可能出现的ClassCastException转到了编译期。
                        **避免了多态的安全隐患
====================================================
这样说你能不能理解怎么用泛型:
       问题:假如我们认为我们的数据存储的都是String类型的,但是 操作的过程中。
*       不小心把Integer类型的数据给存储进去了。也不会报错。因为add方法
*       接受的是一个Object类型的对象。
*       但是,在遍历后使用数据的时候,我们把所有数据在想变成String的时候,
*       有问题了。那么,这个问题,如果解决呢?
*       其实不用怕,前辈已经帮我们解决了--数组。
*       String[] s = new String[3];
*       s[0] = new Integer(20);
*       一开始就明确的告诉你类型,那么,这个时候,你在编译期,如果存储的数据
*       不是想要的类型,就会报错。
*       这个时候,我们就想,集合能不能也提供这样一种功能,在编译期就告诉我
*       里面存储的是什么类型的数据。这样的话,有错误也会在编译期就解决了。
*       集合有吗?有。这就是java提供的泛型的使用。
                                                    希望能理解》》》》
回复 使用道具 举报
泛型是JDK1.5出现的新特性,对于泛型的好处,可以考虑一下几个方面(重点是第3个和第4个):
1.提高了类型的安全性。通过定义泛型,能够使编译器在编译时期就可以对使用泛型定义的变量的类型进行限制和验证。如果没有泛型的话,那只能靠程序员本身记住这些类型限制了。
2.消除了强制类型转换。在没有引入泛型之前,如果类型不匹配,需要进行类型转换,很多时候这些细节的问题很容易被忽略,而有了泛型之后就不用再考虑这些问题了,这使得代码的
   可读性更强,减少了不必要的错误。
3.需要特别注意的是,泛型也反射相结合。泛型是提供给javac编译器使用的。当编译器编译带类型的集合时,会去掉类型信息,使程序运行效率不受影响, 对于参数化的泛型类型,  getClass()方法的返回值和原始类型完全一样。由于编译生成的字节码会去掉泛型的类型信息,所以只要能跳过编译器,就可以往某个泛型集合中存入其他类型的数据。例如,用反射得到集合,再调用它的add()方法即可。
4.泛型中需要特别注意的地方 :
       ·参数化的类型 和 原始类型 可以兼容
            例如: Collection<String> c = new ArrayList();
                      Collection c = new ArrayList<String>();
      ·参数化类型不考虑类型参数的继承关系
           例如:ArrayList<String> a = new ArrayList<Object>(); // 错误
                     ArrayList<Object> a = new ArrayList<String>(); // 错误
      ·在创建数组实例时,数组的元素不能使用参数化的类型
              例如:ArrayList<Integer> arr[] = new ArrayList<Integer>[10]; // 错误
      ·对于赋值
            ArrayList a1 = new ArrayList<String>();
           ArrayList<Object> a2 = a1;
           这两行代码是没有错的,可以分别看做是参数化的类型和原始类型的兼容

希望这几点能够帮助你,特别注意第3和第4点。
回复 使用道具 举报
本帖最后由 王舜民 于 2012-9-4 19:40 编辑

什么时候使用泛型类?当类中要操作的引用数据类型不确定的时候,以前使用的是共性类型Object现在可以使用泛型来解决,比Object更为安全。

其它也不知道了


回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马