java 泛型如何使用
泛型的基本概念
泛型是Java中一种参数化类型的技术,允许在类、接口或方法中使用类型参数,提高代码的复用性和类型安全性。泛型的核心目的是在编译时检查类型错误,避免运行时类型转换异常。
泛型类
泛型类通过在类名后添加类型参数定义,类型参数可以是任意标识符,通常使用大写字母如T、E、K、V等。
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 class Util {
public static <T> void printArray(T[] array) {
for (T item : array) {
System.out.println(item);
}
}
}
调用泛型方法时,可以显式指定类型或由编译器推断:
Integer[] intArray = {1, 2, 3};
Util.<Integer>printArray(intArray); // 显式指定
Util.printArray(intArray); // 类型推断
泛型接口
泛型接口与泛型类类似,通过类型参数定义。
public interface Pair<K, V> {
K getKey();
V getValue();
}
实现泛型接口时需指定具体类型:
public class OrderedPair<K, V> implements Pair<K, V> {
private K key;
private V value;
public OrderedPair(K key, V value) {
this.key = key;
this.value = value;
}
@Override
public K getKey() { return key; }
@Override
public V getValue() { return value; }
}
类型通配符
泛型中使用?表示未知类型,通常用于限制泛型的范围。
<?>:无限制通配符,表示任何类型。<? extends T>:上界通配符,表示T或其子类。<? super T>:下界通配符,表示T或其父类。
public static void printList(List<?> list) {
for (Object item : list) {
System.out.println(item);
}
}
public static double sumOfList(List<? extends Number> list) {
double sum = 0.0;
for (Number num : list) {
sum += num.doubleValue();
}
return sum;
}
泛型限制
- 不能使用基本类型(如
int、double)作为类型参数,需使用包装类(如Integer、Double)。 - 不能直接创建泛型数组,但可以通过反射或通配符实现。
- 泛型类型在运行时会被擦除(Type Erasure),无法获取具体类型信息。
实际应用示例
结合集合框架使用泛型,确保类型安全:
List<String> names = new ArrayList<>();
names.add("Alice");
names.add("Bob");
// names.add(123); // 编译错误
Map<Integer, String> idToName = new HashMap<>();
idToName.put(1, "Alice");
idToName.put(2, "Bob");
String name = idToName.get(1); // 无需强制类型转换
通过合理使用泛型,可以显著提升代码的可读性和健壮性。







