java如何使用泛型
泛型的基本概念
泛型允许在定义类、接口或方法时使用类型参数,使用时指定具体类型。泛型提高了代码的可重用性和类型安全性,避免了强制类型转换。
泛型类
在类名后添加类型参数 <T>,T 可以是任意标识符,通常用大写字母表示。
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(); // 无需强制类型转换
泛型方法
在方法返回类型前声明类型参数 <T>,泛型方法可以在非泛型类中定义。

public <T> void printArray(T[] array) {
for (T element : array) {
System.out.println(element);
}
}
使用示例:
Integer[] intArray = {1, 2, 3};
String[] strArray = {"A", "B", "C"};
printArray(intArray); // 自动推断类型为Integer
printArray(strArray); // 自动推断类型为String
泛型接口
接口也可以定义类型参数,实现类需指定具体类型或保持泛型。
public interface List<T> {
void add(T element);
T get(int index);
}
实现示例:

public class StringList implements List<String> {
private ArrayList<String> items = new ArrayList<>();
@Override
public void add(String element) {
items.add(element);
}
@Override
public String get(int index) {
return items.get(index);
}
}
类型通配符
使用 ? 表示未知类型,通常用于限制泛型的灵活性。
<?>:无限制通配符,匹配任何类型。<? extends T>:上界通配符,表示类型为T或其子类。<? super T>:下界通配符,表示类型为T或其父类。
示例:
public void processList(List<? extends Number> list) {
for (Number num : list) {
System.out.println(num);
}
}
此方法接受 List<Integer>、List<Double> 等参数,但不接受 List<String>。
泛型限制
- 不能使用基本类型(如
int、double),必须用包装类(如Integer、Double)。 - 不能直接实例化泛型类型数组(如
new T[10]),但可以通过反射或强制类型转换实现。 - 静态上下文中不能使用类的类型参数(静态方法需独立声明泛型)。
实际应用场景
- 集合框架(如
ArrayList<T>、HashMap<K,V>)。 - 工具类(如
Collections.sort()的泛型方法)。 - 避免重复代码,实现通用算法(如排序、比较)。
通过泛型,Java 代码在编译时即可捕获类型错误,减少运行时异常,同时增强代码可读性和维护性。






