编写泛型
约 796 字大约 3 分钟
2025-07-17
编写泛型类相较于编写普通类更为复杂,通常泛型类多用于集合类中,例如 ArrayList<T>
。一般情况下,我们很少需要编写泛型类,但如果确有需要,可以按照以下步骤进行:
- 首先,使用具体的类型(例如
String
)编写类。 - 然后,找出所有特定的类型,将其替换为
T
,并声明<T>
。 - 熟练之后,可以直接从
T
开始编写。
以下是一个从具体类型到泛型的示例:
原始代码 (使用
String
类型)public class Pair {
private String first;
private String last;
public Pair(String first, String last) {
this.first = first;
this.last = last;
}
public String getFirst() {
return first;
}
public String getLast() {
return last;
}
}
修改后的泛型代码 (使用泛型
T
)public class Pair<T> {
private T first;
private T last;
public Pair(T first, T last) {
this.first = first;
this.last = last;
}
public T getFirst() {
return first;
}
public T getLast() {
return last;
}
}
3.1 静态方法
编写泛型类时,需要特别注意泛型类型 <T>
不能用于静态方法。
例如,以下代码是错误的:
public class Pair<T> {
private T first;
private T last;
public Pair(T first, T last) {
this.first = first;
this.last = last;
}
public T getFirst() { ... }
public T getLast() { ... }
// 对静态方法使用<T>:
public static Pair<T> create(T first, T last) {
return new Pair<T>(first, last);
}
}
上述代码会导致编译错误,因为无法在静态方法 create()
的方法参数和返回类型上使用泛型类型 T
。
虽然可以通过在 static
修饰符后面添加一个 <T>
来避免编译错误,但这实际上会使静态方法中的 <T>
与 Pair<T>
中的 <T>
没有任何关系。
对于静态方法,应该将其改写为“泛型”方法,使用另一个类型即可。对于上面的 create()
静态方法,应该将其改为另一种泛型类型,例如 <K>
:
public class Pair<T> {
private T first;
private T last;
public Pair(T first, T last) {
this.first = first;
this.last = last;
}
public T getFirst() { ... }
public T getLast() { ... }
// 静态泛型方法应该使用其他类型区分:
public static <K> Pair<K> create(K first, K last) {
return new Pair<K>(first, last);
}
}
这段代码展示了如何在静态方法中使用泛型。关键在于,静态方法中的泛型类型 <K>
与类定义的泛型类型 <T>
是相互独立的。这意味着静态方法可以处理不同于类泛型类型的类型。在本例中,create
方法接收两个类型为 K
的参数,并返回一个 Pair<K>
实例。这种方式避免了静态方法错误地使用了类泛型类型,保证了类型安全。
3.2 多个泛型类型
泛型还可以定义多种类型。例如,如果希望 Pair
不总是存储两个类型一样的对象,可以使用类型 <T, K>
:
public class Pair<T, K> {
private T first;
private K last;
public Pair(T first, T last) {
this.first = first;
this.last = last;
}
public T getFirst() { ... }
public K getLast() { ... }
}
使用时,需要指出两种类型:
Pair<String, Integer> p = new Pair<>("test", 123);
Java 标准库的 Map<K, V>
就是使用两种泛型类型的例子,它对 Key 使用一种类型,对 Value 使用另一种类型。