java 泛型如何使用
泛型的基本概念
Java泛型是JDK 5引入的特性,允许在定义类、接口或方法时使用类型参数。泛型的核心目的是提高代码复用性和类型安全性,避免运行时类型转换错误。
泛型类的定义
通过尖括号<>声明类型参数,例如:
public class Box<T> {
private T content;
public void setContent(T content) {
this.content = content;
}
public T getContent() {
return content;
}
}
使用时指定具体类型:
Box<String> stringBox = new Box<>();
stringBox.setContent("Hello");
String value = stringBox.getContent(); // 无需强制转换
泛型方法的定义
方法也可以独立使用泛型,类型参数放在返回类型前:

public <T> void printArray(T[] array) {
for (T element : array) {
System.out.println(element);
}
}
调用时编译器会推断类型:
Integer[] intArray = {1, 2, 3};
printArray(intArray); // 自动推断T为Integer
类型通配符
使用?表示未知类型,常用于方法参数:
public void processList(List<?> list) {
for (Object elem : list) {
System.out.println(elem);
}
}
受限通配符:

<? extends Number>表示Number或其子类<? super Integer>表示Integer或其父类
泛型接口
接口同样可以使用泛型:
public interface Pair<K, V> {
K getKey();
V getValue();
}
实现时需要指定具体类型或保留泛型:
public class OrderedPair<K, V> implements Pair<K, V> {
private K key;
private V value;
// 实现接口方法...
}
类型擦除
Java泛型在编译后会进行类型擦除,所有泛型信息会被替换为原始类型。例如List<String>在运行时变为List,因此以下操作是非法的:
// 编译错误
if (list instanceof List<String>) { ... }
最佳实践
- 尽量使用泛型集合而非原始类型(如优先
List<String>而非List) - 避免在静态上下文中使用类的类型参数
- 合理使用通配符提高API灵活性
- 注意泛型数组的创建限制(不能直接
new T[])
通过泛型可以显著减少类型转换代码,同时提供编译时类型检查,是Java类型系统的重要补充。





