Github代码链接: https://github.com/deyou123/corejava.git
第八章 泛型程序设计
8.1 为什么要使用泛型程序设计
泛型程序设计: 意味着编写的代码可以被很多不同类型的对象所重用。
8.1.1 类型参数的好处
类型参数
- Java SE7 及以后,构造函数中可以省略泛型类型:
ArrayList< String > array = new ArrayLIst<>();
省略的累心更可以从变量的类型中推断得出。 - 类型参数的魅力在于: 使得程序具有更好的可读性和安全性。
8.1.2 谁想成为反省程序员
8.2 定义简单泛型类
8.3 泛型方法
class ArrayAlg
{
public static <T> T getMiddle(T...a)
{
return a[a.length / 2];
}
}
-
注意,类型变量放在修饰符(这里public static) 的后面,返回类型的前面。
-
泛型方法可以定义在普通类中,也可以定义在泛型类中
。 -
当调用一个泛型方法时,在方法名前的尖括号中放人具体的类型:
String middle =ArrayAlg.< String > getMiddle("]ohnM,“Q. n,” Public"); -
在这种情况(实际也是大多数情况)下,方法调用中可以省略< String > 类型参数。编译器有足够的信息能够推断出所调用的方法。可以调用:
String middle =ArrayAlg.getHiddle("]ohn", “Q.”, “Public”);
8.4 类型变量的限定
-
可以通过对类型变量T 设置限定(bound) 实现这一点:
public static Tmin(T[] a) . . . -
下面的记法:
< T extends BoundingType >
表示T 应该是绑定类型的子类型(subtype) -
T 和绑定类型可以是类,也可以是接口。
-
一个类型变量或通配符可以有多个限定,例如:
T extends Comparable & Serializable
8.5 泛型代码和虚拟机
8.5.1 类型擦除
- 无论何时定义一个泛型类型,都自动提供了一个相应的原始类型(raw type) 。
- 原始类型的名字就是删去类型参数后的泛型类型名。
- 擦除(erased ) 类型变量, 并替换为限定类型(无限定的变量用Object) 。
- 例如,Pair 的原始类型如下所示:
public class Pair
{
private Object first;
private