第八章 泛型程序设计

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

  • Generic Programming意味着编写的代码可以被很多不同类型的对象所重用。
  • 类型参数的魅力在于:使得程序具有更好的可读性和安全性。

定义简单泛型类

  • 一个泛型类Generic class就是具有一个或多个类型变量的类
  • Java中,使用E表示集合的元素类型,K和V表示Map的关键字和值的类型。T(需要时还可以使用临近的U和S)表示“任意类型”。
  • 泛型类可以看作普通类的工厂

泛型方法

  • 类型变量放在修饰符的后面,返回类型的前面。泛型方法可以定义在普通类中,也可以定义在泛型类中。
  • 当调用一个方法时,在方法名前的尖括号中放入具体的类型。

类型变量的限定

  • 表示T应该是绑定类型的子类型subtype,T和绑定类型可以是类,也可以是接口。一个类型变量或通配符可以有多个限定(用&)
  • 如果用一个类作为限定,它必须是限定列表中的第一个。

泛型代码和虚拟机

  • 无论何时定义一个泛型类型,都自动提供了一个相应的原始类型raw type。原始类型的名字就是删去类型参数后的泛型类型名。擦除erased类型变量,并替换为限定类型(无限定的变量用Object)
  • 为了提高效率,应该将标签tagging接口(即没有方法的接口)放在边界列表的末尾。
  • 桥方法bridge method
  • 具有协变的返回类型covariant return types
  • 记住有关泛型转换的事实:1.虚拟机中没有泛型,只有普通的类和方法;2.所有的类型参数都用它们的限定类型替换;3.桥方法被合成来保持多态;4.为保持类型安全性,必要时插入强制类型转换。

约束与局限性

  1. 不能用基本类型实例化类型参数
  2. 运行时类型查询只适用于原始类型
  3. 不能创建参数化类型的数组
  4. Varargs警告:使用@SafeVarargs
  5. 不能实例化类型变量
  6. 不能构造泛型数组
  7. 泛型类的静态上下文中类型变量无效
  8. 不能抛出或捕获泛型类的实例
  9. 可以消除对受查异常的检查
  10. 注意擦除后的冲突

泛型类型的继承规则

通配符类型

  • 通配符类型中,允许类型参数变化。如Class表示任何泛型Class类型,它的类型参数是SuperClass的子类,如Class
  • 超类型限定supertype bound:? super subClass 这个通配符限制为subClass的所有超类型。可以为方法提供参数,但不能使用返回值。
  • 无限定通配符 :Class 和Class本质的不同在于:可以用任意的Object对象调用原始class的setObject方法

反射和泛型

  • Class类是泛型的
    了解泛型的更多信息:http://angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html

你可能感兴趣的:(第八章 泛型程序设计)