public Pair(T first, T second) { this.first = first; this.second = second; }
public T getFirst() { return first; }
public T getSecond() { return second; }
public void setFirst(T newValue) { first = newValue; }
public void setSecond(T newValue) { second = newValue; }
}
复制代码
Pair 类引入了一个类型参数 T,用尖括号(< >)括起来,并放在类名的后面。
泛型类可以有多个类型参数。如果有多个类型变量,多个类型变量之间用 “,”逗号分隔。例如,可以定义 Pair 类,其中第一个域和第二个域使用不同的类型:public class Pair { ... }
类定义中的类型参数指定方法的返回类型以及域和局部变量的类型。例如,private T first;
用具体的类型替换类型参数就可以实例化泛型类型,例如:Pair 可以将结果想象成带有构造器的普通类:
Pair()
Pair(String, String)
和方法:
String getFirst()、String getSecond()
void setFirst(String)、void setSecond(String)
换句话说,泛型类可看作普通类的工厂。
泛型方法
前面已经介绍了如何定义一个泛型类。实际上,还可以定义一个带有类型参数的简单方法。
class ArrayAlg {
public static <T> T getMiddle(T... a) {
return a[a.length / 2];
}
}
复制代码
这个方法是在普通类中定义的,而不是在泛型类中定义的。然而,这是一个泛型方法,可以从尖括号和类型参数看出这一点。注意,类型参数放在修饰符(这里是 public static)的后面,返回类型的前面。
泛型方法可以定义在普通类中,也可以定义在泛型类中。
当调用一个泛型方法时,在方法名前的尖括号中放入具体的类型:
当存取一个泛型域时也要插入强制类型转换。假设 Pair 类的 first 域和 second 域都是公有的,表达式:Employee buddy = buddies.first;也会在结果字节码中插入强制类型转换。
翻译泛型方法
类型擦除也会出现在泛型方法中。程序员通常认为下述的泛型方法 public static T min(T[] a)是一个完整的方法族,而擦除类型之后,只剩下一个方法:public static Comparable min(Comparable[] a)
注意,类型参数 T 已经被擦除了,只留下了限定类型 Comparable。
类型擦除带来了两个复杂问题。看一看下面这个示例: