美文网首页
第8章 泛型程序设计

第8章 泛型程序设计

作者: KaveeDJ | 来源:发表于2019-06-15 01:11 被阅读0次

    第8章 泛型程序设计

    • 使用泛型要比直接使用Object,让后进行强制类型转换要安全

    8.1 为什么要使用泛型程序设计

    • 一个ArrayList类可以聚集任何类型的对象,这是一个泛型程序设计的实例

    8.1.1 类型参数的好处

    • 如果强制类型转换不是真实类型,就会产生异常
    • 泛型提供了一个更好的解决方案:类型参数
    • 提高了可读性与安全性

    8.1.2 谁想成为泛型程序员

    • 使用级别
    • 理解级别
    • 创新级别

    8.2 定义简单泛型类

    • 核心就是类型变量

    8.3 泛型方法

    • 不用写返回类型,编译器会推断类型

    8.4 类型变量的限定

    • T extends Comparable:用extends而不用implements是因为extends包含子类的概念,更加形象

    8.5 泛型代码和虚拟机

    • 虚拟机没有泛型类型对象——所有对象都属于普通类

    8.5.1 类型擦除

    • 无论何时定义一个泛型类型,都自动提供一个原始类型
    • 无限定类型参数,直接替换为Object
    • 有限定类型的参数,替换为限定类型

    8.5.2 翻译泛型表达式

    • 当程序调用泛型类时
      1. 调用原始方法
      2. 将结果强转为泛型类型

    8.5.3 翻译泛型方法

    • 虚拟机中没有泛型,只有普通的类和方法
    • 为保持类型安全性,必要时插入强制类型转换

    8.5.4 调用遗留代码

    • 注解会关闭对方法中所有代码的检查
    • @SuppressWarnings("unchecked")

    8.6 约束与局限性

    • 大多数限制都是由类型擦除引起的

    8.6.1 不能用基本类型实例化类型参数

    • 基本类型不能作为泛型

    8.6.2 运行时类型查询只适用于原始类型

    • 泛型对象,只有一个原始类型
      -Pair<?>,无论?是什么类型,只有一个Pair.class

    8.6.3 不能创建参数化类型的数组

    • Pair<String>[] table = new Pair<String>[10];这是错误的
    • 如果需要收集参数化类型对象,只有一种方法:ArrayList<Pair<String>>

    8.6.4 Varargs警告

    • 可变参数,本质是数组,这种情况下使用参数化类型数组,只有警告,并不是错误

    8.6.5 不能实例化类型变量

    • 使用泛型类型的.class方法new一个实例

    8.6.6 不能构造泛型数组

    • 底层依然是用class文件

    8.6.7 泛型类的静态上下文中类型变量无效

    • 泛型不能和static一起使用

    8.6.8 不能抛出或捕获泛型类的实例

    • 泛型类扩展Throwable是不合法的
    • 泛型对象不能catch
    • 可以throw和throws

    8.6.9 可以消除对受查异常的检查

    • Java异常处理的一个基本原则是,必须为所有的受查异常提供一个处理器

    8.6.10 注意擦除后的冲突

    • 本质上是一个接口,就不用写泛型

    8.7 泛型类型的继承规则

    • 无论S与T有什么联系,通常,Pair<S>Pair<T>没有什么联系

    8.8 通配符类型

    • 固定的泛型类型系统使用起来并没有那么令人愉快

    8.8.1 通配符概念

    • 向上限定:? extends Employee

    8.8.2 通配符的超类型限定

    • 向下限定:? super Manager

    8.8.3 无限定通配符

    • Pair<?>:仅仅只能使用get方法,返回Object,不能使用set方法

    8.8.4 通配符捕获

    • 作为参数传递的时候,内部方法可以捕获通配符
    public static void swap(Pair<?> p) { 
        swapHelper(p);
    }
    

    8.9 反射和泛型

    • 反射允许你在运行时分析任意的对象

    8.9.1 泛型Class类

    • 现在,Class类是泛型的

    8.9.2 使用Class<T> 参数进行类型匹配

    • Employee.class是类型Class<Employee>的一个对象

    8.9.3 虚拟机中的泛型类型信息

    • 擦除的类仍然保留一些泛型祖先的微弱记忆,例如,原始的Pair类知道源于泛型类Pair<T>

    相关文章

      网友评论

          本文标题:第8章 泛型程序设计

          本文链接:https://www.haomeiwen.com/subject/ksgmfctx.html