zoukankan      html  css  js  c++  java
  • java泛型笔记一


    名词:泛型类 泛型方法 原始类型 子类型 版本 参数化类型 通配符类型 超类通配 子类通配 全通配
    定义变量 创建对象 检查模板 类型实参 类型形参 补充 替代
    语法特征:尖括号括起来的类型参数表
    //不一定是术语,有些自己想的,主要是用于帮助理解概念。

    1.什么是泛型
    参数化类型,可以把类型当作参数使用。
    普通的参数,形参是变量,实参是各种类型的值。
    参数化类型,形参是变量,实参使用的类型。
    2.为什么需要泛型
    有需求:编写的代码可以被许多不同类型的对象所重用(这叫做泛型程序设计)。
    起初这样的需求在Java中,通过单继承机制,强制类型转换实现。
    1.5引入Java泛型机制,本质是对单继承实现的泛型程序设计的一种补充,让其更安全,可读性更好。

    泛型的实现:
    1.5以前java通过继承实现泛型,1.5引入类型参数机制,这是对原先继承实现的一种补充。

    好处:
    根据类型参数提供的信息//可读性好,看见类型参数就可知道使用的类型
    1.进行编译检查,将原来运行时期的类型转换异常问题转到了编译时期,使问题在编译时期解决。//更安全
    2.可以自动进行强制类型转换。不需要使用者强制类型转换了。//更安全

    java泛型是编译时期的技术,确保类型安全,然后将所有子类型都处理为原始类型,生成的class文件是不带泛型的。
    虚拟机并没有泛型。

    泛型的擦除://为了兼容运行的类加载器。
    编译时期在进行完编译检查等工作后,将所有泛型子类型都处理为原始类型。
    泛型的补偿:
    在运行时,通过获取元素的类型进行转换,不用使用者强制转换。

    2.实现java语言对泛型的支持
    a.Object方案
    缺点:1.可以使用任意类型,没有错误检查2.获取时必须进行强制类型转换
    b.类型参数方案
    优点:可读性好,安全性高1.检查参数类型2.自动强制类型转换(都能减少错误的发生)

    3.泛型的使用
    (1.1)类型变量
    类型参数(type parameters)通常用单个大写字母表示
    命名泛型字母可以随意指定,尽量使用单个的大写字母(有时候多个泛型类型时会加上数字,比如T1,T2)
    常见字母(见名知意)
    T Type
    K V Key Value
    E Element
    当类被使用时,会使用具体的实际类型参数(actual type argument)代替
    (1.2)类型限定:一个类型变量或通配符可以有多个限定
    <T extends BoundingType>
    <T extends BoundingType1 & BoundingType2>
    (1.3)通配符类型:
    a.只能用来定义变量,不能创建对象。
    b.通配符限定变量的类型,类型变量限定的是全部可用类型,两者限定的东西不同
    全通配:
    <?>
    子类通配:
    <? extends BoundingType>
    超类通配:
    <? super BoundingType>

    名词:泛型类 泛型方法 原始类型 子类型 参数化类型 通配符类型 超类通配 子类通配 全通配
    定义变量 创建对象 检查模板
    语法特征:尖括号括起来的类型参数表
    //不一定是术语,有些自己想的,主要是用于帮助理解概念。

    (2)泛型类
    <类型参数表>,并紧跟在类名后面,此处禁止使用通配符
    (2.1)定义变量
    Pair<String> p1 (只能引用Pair<String>对象)
    Pair<Student> p2 (只能引用Pair<Student>对象)
    p1和p2不能赋值,不同类型之间不能相互赋值
    (2.2)创建对象
    new Pair<String>(str1, str2)
    new Pair<Student>(stu1, stu2)

    (3)泛型接口
    <类型参数表>,并紧跟在接口名后面
    (4)泛型方法
    <类型参数表>,并放在返回值前面,修饰符后面

    定义变量:原始类型、子类型、通配类型都可以定义变量,不同变量之间赋值有限制。
    (可以作为参数、返回值)
    Pair pair
    Pair<Employee> pair
    Pair<? extends Employee> pair
    Pair<? super Employee> pair
    Pair<?> pair

    Pair<T> pair//错误,不能用类型形参定义变量,用于泛型类和泛型方法的定义,在意义上等于Pair pair
    创建对象:
    new Pair()
    new Pair<Employee>()
    通配类型参数不能创建对象
    创建数组:

    ---检查模板---引入概念,可以认为原始类型、子类型、通配类型使用不同的检查模板,但实现都为原始类型。
    所有的泛型类对象最终都用原始类型实现,但不同的子类型它们的检查模板不同。

    java泛型的约束
    1.使用约束:不能创建子类型数组,类型擦除无法保证类型安全。
    2.定义约束:主要是泛型类和泛型方法定义时,类型形参不能用来创建对象和数组,只能定义变量

    桥方法:
    当普通类继承泛型子类型时,并覆盖了类型方法(即在参数或返回值中使用了类型参数的方法)
    就会生成桥方法,保持多态。
    举例:
    DateInterval extends Pair<LocalDate>
    当DateInterval类有void setSecond(LocalDate second)时,会自动生成一个桥方法,内部调用新方法
    void setSecond(Object second){setSecond((LocalDate) second)}

    泛型实例:
    1.分页的Page
    2.Comparator和Comparable
    3.java.util.Arrays和java.util.Collections中的sort方法
    4.集合框架


  • 相关阅读:
    图片轮播
    swoole 内存泄露的问题有没有好的办法解决
    学习Swoole需要掌握哪些基础知识
    通过SSH通道来访问MySQL
    redis常见应用场景
    Redis 消息队列的实现
    PHP-Curl模拟HTTPS请求
    代码重构方向原则指导
    win8.1系统相关
    SQL Server 学习系列之六
  • 原文地址:https://www.cnblogs.com/mozq/p/10228854.html
Copyright © 2011-2022 走看看