java泛型如何使用
泛型的基本概念
泛型(Generics)是Java 5引入的特性,允许在类、接口或方法中使用类型参数,从而提供编译时类型检查,避免运行时类型转换错误。泛型的核心目的是增强代码的复用性和类型安全性。
泛型类
泛型类通过在类名后添加类型参数(如<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 item : array) {
System.out.println(item);
}
}
调用时可通过上下文推断类型:
Integer[] intArray = {1, 2, 3};
printArray(intArray); // 自动推断T为Integer
泛型接口
泛型接口与泛型类类似,通过类型参数定义接口的行为。
public interface List<T> {
void add(T item);
T get(int index);
}
实现时需指定具体类型:

public class StringList implements List<String> {
@Override
public void add(String item) { /* ... */ }
@Override
public String get(int index) { /* ... */ }
}
类型通配符
通配符(?)用于处理未知类型,通常分为以下三种:
- 无界通配符
<?>:表示任意类型。 - 上界通配符
<? extends T>:表示T或其子类。 - 下界通配符
<? super T>:表示T或其父类。
示例:
public void processList(List<? extends Number> list) {
for (Number num : list) {
System.out.println(num.doubleValue());
}
}
泛型限制
- 类型擦除:泛型信息在编译后会被擦除,运行时无法获取类型参数的具体类型。
- 不能实例化泛型类型:如
new T()是非法的。 - 不能用于静态上下文:类的静态方法或变量不能使用类的泛型参数。
实际应用示例
集合框架(如ArrayList、HashMap)广泛使用泛型:
List<String> names = new ArrayList<>();
names.add("Alice");
Map<Integer, String> idToName = new HashMap<>();
idToName.put(1, "Bob");
通过合理使用泛型,可以显著提升代码的类型安全性和可读性。






