zoukankan      html  css  js  c++  java
  • 关于Java泛型的新解

    ////////////////////////////////////////////////////////////////////////////////为了方便您的观看,请在web版式视图在观看本文章。//////////////////////////////////////////////////////////////////////////////////////////////

    《关于泛型》

    -----------------------------------à入门泛型的基本应用

    $1.体验泛型

    泛型是JDK1.5的所有新特性中最难深入透彻掌握的部分。不过,我们在实际应用中不能掌握得那么深入,掌握泛型中一些最基本的内容就差不多了。没有使用泛型时,只要是对象,不管是什么类型的对象,都可以存储进同一个集合中。使用泛型集合,可以将一个集合的元素限定为一个特定类型,集合中只能存储同一个类型的对象。这样就更加安全,并且在从集合中获取一个对象的时候,编译器也可以知道这个对象的类型,不需要对对象进行强制转换。这样使得程序员更加方便。

      

      JDK1.5以前的集合类中存在什么问题?

    JDK1.5的集合类型希望在定义集合的时候,明确表示要向集合中装哪种类型的数据,无法加入指定类型以外的数据。

     泛型是提供给javac编辑器使用的,可以限定集合中的输入类型,让编译器挡住源程序的非法输入,编译器编辑带类型说明的集合时,会去除掉‘类型’信息。使程序运行的效果不受到影响,对于参数化的泛型类型,getClass()方法返回值和原始类型是完全一样的。由于编译生成的字节码会去除掉泛型的类型信息,只要能跳过编译器,就可以往某个泛型集合中加入其他类型的数据。例如:用反射得到集合,再调用其他add()方法即可。

     

    $2.泛型的内部原理及应用(更深层级理解)

     了解泛型

          ArrayList<E>类定义和ArrayList<Integer>类引用中涉及到的术语有如下:

    整个称ArrayList<E>为 泛型类型。

    ArrayList<E>中的E称为 类型变量或者类型参数
    整个ArryList<Integer>称为 参数化的类型。

    ArrayList<Integer>中的Integer称为 类型参数的实例或者实例参数。

    ArratList<Integer>中的 <> 读作 typeof。

    ArrayList成为原始类型。

    参数化类型与原始类型的兼容性

     

         参数化的类型可以引用一个原始类型的对象,编译会报告警告,例如:

     原始类型可以引用一个参数化的类型,编译会报告错误,例如:

     参数化类型不考虑类型参数的继承关系。

    在创建数组实例时,数组元素是不能使用参数化的类型的,例如:

    思考下列的代码是否会报错?

    $2.泛型的通配符扩展应用

     

    泛型中的  ? 通配符

     

    问题:          定义一个方法:该方法用于打印任意参数类型的集合中的所有资源,该方法该如何去定义呢?

       

     ▼错误方式:

    ▼正确方式:

    总结:

        

           使用 ? 通配符可以引用其他各种参数化的类型,?通配符定义的变量主要用作引用,可以调用与参数化无关的方法,不能调用与参数化有关的方法。

    泛型中的  ? 通配符 的扩展

       

    限定通配符的上边界。

      

    ▼正确方式:

    ▼错误方式:

    限定通配符的下边界。

       

    ▼正确方式:

    ▼错误方式:

    提示:

       ◆限定通配符总是包括自己的。

    ----------------------------------------------------------------------------

     

    $3.泛型集合的综合案例。

     

    能写出下面的代码即 代表 已经掌握了java的泛型基本类:

    对在jsp页面中也经常要对Set或者Map集合进行迭代:

    $4.自定义泛型方法及其应用

     

    C++的模板函数引入自定义泛型

      如下函数的结构很相似,仅类型不同

      C++模板函数解决,只写一个通用的方法,它可以适应各种类型,示意代码如下:

    java中的泛型类型(或者泛型)类似于C++中的模板。但是这种相似性仅限于表面。Java语言中的泛型基本上是完全在编译器中实现, 用于编译器执行类型检查和类型判断,然后生成普通的非泛型的字节码。这种实现技术被称为擦除(erasure)(编译器使用泛型信息保证类型安全,然后再生成字节码之前将其清除)。 这是因为扩展虚拟机指令集来支持泛型被认为是无法接受的,这会为java厂商升级其JVM造成难以逾越的障碍。所以,java的泛型采用了可以完全在编译器中实现的擦除方法。

    例如:下面的这两种方法,编译器会报告错误,它不认为是两个不同的参数类型,而认为是同一种参数类型,所以不能做到 方法的重载。

    $5.定义泛型方法

     java的泛型方法没有C++模板函数功能强大,java的如下代码是无法通过编译的:

     

  • 相关阅读:
    【腾讯Bugly干货分享】移动互联网测试到质量的转变
    【腾讯Bugly干货分享】微信终端跨平台组件 mars 系列(一)
    如何用手机维护Mysql数据库
    企业内网信息安全实践-记ChinaUnix技术交流
    完成《Java编程入门》初稿
    Windows Server 2012下安装Hyper-V虚拟机
    MacOSX和Windows 8的完美融合
    Iphone5S 体验(视频+截图)
    PC上安装MAC X Lion
    正宗PC Unix实验环境
  • 原文地址:https://www.cnblogs.com/fkeyta/p/6285067.html
Copyright © 2011-2022 走看看