java泛型如何使用
泛型的基本概念
Java泛型是一种在编译时进行类型检查的机制,允许开发者定义类、接口或方法时使用类型参数。泛型的核心目的是提高代码复用性和类型安全性,避免运行时类型转换错误。
泛型类定义
在类名后添加尖括号<>声明类型参数,例如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(); // 无需强制转换
泛型方法
泛型方法在方法返回类型前声明类型参数,可独立于类的泛型参数:
public <E> void printArray(E[] array) {
for (E element : array) {
System.out.println(element);
}
}
调用时编译器会推断类型:
Integer[] intArray = {1, 2, 3};
printArray(intArray); // 自动推断E为Integer
类型通配符
使用?表示未知类型,常用于泛型集合的灵活性处理:
List<?>:接受任何类型的ListList<? extends Number>:接受Number及其子类(上界通配符)List<? super Integer>:接受Integer及其父类(下界通配符)
示例:
public static double sum(List<? extends Number> list) {
double sum = 0;
for (Number num : list) {
sum += num.doubleValue();
}
return sum;
}
泛型接口
接口定义方式与类类似:
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,元素类型变为Object。运行时无法获取泛型的具体类型信息。
注意事项
- 不能使用基本类型作为泛型参数(如
List<int>非法,需用List<Integer>) - 无法直接创建泛型数组(如
new List<String>[10]非法) - 静态方法或静态变量不能使用类的泛型类型参数
通过合理使用泛型,可以显著提升代码的类型安全性和可读性,同时减少类型转换的冗余代码。







