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 <T> void printArray(T[] array) {
for (T element : array) {
System.out.print(element + " ");
}
}
调用时类型可显式指定或由编译器推断:
Integer[] intArray = {1, 2, 3};
printArray(intArray); // 自动推断为Integer
类型通配符与边界
- 通配符
?:用于接受未知类型,如List<?>。 - 上界通配符
<? extends T>:限制类型为T或其子类。 - 下界通配符
<? super T>:限制类型为T或其父类。
示例:
public static void process(List<? extends Number> list) {
for (Number num : list) {
System.out.println(num);
}
}
泛型接口
接口同样可以定义泛型:
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; }
}
类型擦除与限制
Java泛型通过类型擦除实现,运行时类型参数会被替换为Object或其上界。因此:
- 不能实例化泛型类型:
new T()是非法的。 - 不能创建泛型数组:
T[] array = new T[10];会报错。 - 静态成员不能使用泛型类型参数。
实际应用示例
结合集合框架使用泛型:
List<String> names = new ArrayList<>();
names.add("Alice");
names.add("Bob");
String first = names.get(0); // 直接获取String类型
通过泛型,Java实现了类型安全的集合操作和灵活的代码设计。







