泛型 Java 怎么写
泛型的基本概念
泛型(Generics)是 Java 5 引入的一项特性,它允许在定义类、接口或方法时使用类型参数,从而在编译时进行类型检查,避免类型转换异常,泛型的核心目标是提高代码的类型安全性,减少运行时错误,并增强代码的可重用性。

在 Java 中,泛型通过尖括号 <> 表示,List<String> 表示一个只能存储字符串的列表,泛型类型参数通常使用单个大写字母表示,如 E(Element)、T(Type)、K(Key)、V(Value)等。
List<String> stringList = new ArrayList<>();
stringList.add("Hello");
// stringList.add(123); // 编译错误,类型不匹配
泛型的类和接口
泛型类是在类名后面加上类型参数,
public class Box<T> {
private T content;
public void setContent(T content) {
this.content = content;
}
public T getContent() {
return content;
}
}
使用时可以指定具体类型:
Box<Integer> integerBox = new Box<>(); integerBox.setContent(100);
泛型接口的定义与泛型类类似,

public interface Generator<T> {
T next();
}
泛型方法
泛型方法是在方法返回值前声明类型参数,与类是否为泛型无关。
public static <T> void printArray(T[] array) {
for (T element : array) {
System.out.println(element);
}
}
调用时可以显式指定类型或让编译器推断:
printArray(new String[]{"A", "B", "C"});
通配符(Wildcards)
泛型通配符用于表示未知类型,主要有三种形式:
- 无界通配符 :表示任意类型,
List<?>可以接受任何List。 - 上界通配符
? extends T:表示T或其子类,List<? extends Number>可以接受List<Integer>或List<Double>。 - 下界通配符
? super T:表示T或其父类,List<? super Integer>可以接受List<Integer>或List<Number>。
示例:

public void processList(List<? extends Number> list) {
for (Number num : list) {
System.out.println(num);
}
}
泛型的类型擦除
Java 的泛型是“伪泛型”,在编译后类型信息会被擦除,即泛型类型在运行时会被替换为它的边界类型(如果没有边界则替换为 Object)。
List<String>和List<Integer>在编译后都会变成List。- 类型擦除会导致泛型无法直接使用
instanceof或创建泛型数组,// List<String>[] listArray = new List<String>[10]; // 编译错误
泛型的限制
- 不能创建泛型数组:因为类型擦除会导致数组类型不一致。
- 静态变量不能使用泛型类型:静态变量属于类级别,而泛型类型实例可能不同。
- 基本类型不能作为泛型类型参数:需要使用包装类,如
List<Integer>而不是List<int>。 - 泛型类型参数不能用于异常类:不能抛出或捕获泛型异常。
泛型的最佳实践
- 优先使用泛型:在集合、工具类等场景中,使用泛型提高类型安全性。
- 避免过度使用通配符:仅在需要灵活处理多种类型时使用通配符。
- 合理设置边界:通过
extends或super限制泛型类型范围,增强代码健壮性。 - 注意类型擦除的影响:避免依赖运行时类型信息,例如反射时需额外处理。
示例代码
以下是一个综合示例,展示泛型类、方法和通配符的使用:
public class GenericDemo {
public static void main(String[] args) {
Box<String> stringBox = new Box<>();
stringBox.setContent("Hello Generics");
System.out.println(stringBox.getContent());
Box<Integer> integerBox = new Box<>();
integerBox.setContent(123);
System.out.println(integerBox.getContent());
String[] strArray = {"A", "B", "C"};
printArray(strArray);
List<Integer> intList = Arrays.asList(1, 2, 3);
processList(intList);
}
public static <T> void printArray(T[] array) {
for (T element : array) {
System.out.println(element);
}
}
public static void processList(List<? extends Number> list) {
for (Number num : list) {
System.out.println(num.doubleValue());
}
}
}
泛型是 Java 中强大的类型安全工具,通过类型参数、通配符和边界机制,能够显著提升代码的可读性、可维护性和健壮性,掌握泛型的基本概念、使用场景及限制,有助于编写更高质量的 Java 程序,在实际开发中,应根据需求合理设计泛型类和方法,避免滥用或误用泛型特性。



















