java 如何定义泛型
定义泛型类
在类名后添加尖括号 <T>,T 是类型参数占位符(可自定义为其他字母,如 E、K、V 等)。泛型类中的字段、方法参数或返回值可使用该类型参数。
public class Box<T> {
private T content;
public void setContent(T content) {
this.content = content;
}
public T getContent() {
return content;
}
}
定义泛型方法
在方法返回值前声明类型参数 <T>,泛型方法可独立于类是否为泛型类。

public <T> void printArray(T[] array) {
for (T element : array) {
System.out.print(element + " ");
}
}
多类型参数
泛型支持多个类型参数,用逗号分隔。

public class Pair<K, V> {
private K key;
private V value;
public Pair(K key, V value) {
this.key = key;
this.value = value;
}
}
泛型通配符
使用 ? 表示未知类型,通常用于方法参数以增强灵活性:
<?>:无限制通配符。<? extends T>:上界通配符,表示T或其子类。<? super T>:下界通配符,表示T或其父类。
public void processList(List<? extends Number> list) {
for (Number num : list) {
System.out.println(num);
}
}
类型擦除与限制
Java 泛型在编译后会被擦除为原始类型(如 Object),因此运行时无法获取泛型的具体类型。
- 不能实例化泛型类型:
new T()是非法的。 - 不能用于静态上下文:静态字段或方法不能使用类的类型参数。
- 不能使用基本类型:泛型类型必须为引用类型(如
Integer而非int)。
实际应用示例
Box<String> stringBox = new Box<>();
stringBox.setContent("Hello");
System.out.println(stringBox.getContent()); // 输出 "Hello"
Pair<Integer, String> pair = new Pair<>(1, "Apple");
List<Double> numbers = Arrays.asList(1.1, 2.2);
processList(numbers); // 输出 1.1 和 2.2






