Java泛型 的详细知识总结
一、泛型的核心作用
- 类型安全:在编译期检查类型匹配,避免运行时的
ClassCastException。 - 代码复用:通过泛型逻辑统一处理多种数据类型。
 - 消除强制转换:减少显式的类型转换代码。
 
二、泛型基础语法
1. 泛型类/接口
- 定义:在类/接口名后添加类型参数
<T>,T为占位符类型。<JAVA>
public class Box<T> {private T content;public void set(T content) { this.content = content; }public T get() { return content; } } 
2. 泛型方法
- 定义:在方法返回类型前声明泛型类型。  
<JAVA>
public <T> void printArray(T[] array) {for (T element : array) {System.out.print(element + " ");} } 
3. 泛型通配符 ?
 
- 作用:表示未知类型,增强灵活性。 
- 上界通配符 
<? extends T>:接受T及其子类。<JAVA>
// 接受Number或其子类(如Integer/Double)的列表 public void process(List<? extends Number> list) { /* ... */ } - 下界通配符 
<? super T>:接受T及其父类。<JAVA>
// 接受Integer或其父类(如Number/Object)的列表 public void addNumbers(List<? super Integer> list) { list.add(42); } 
 - 上界通配符 
 
三、泛型深入原理
1. 类型擦除(Type Erasure)
- 原理:编译期将泛型类型替换为原始类型(如
Object或上界类型),并在必要时插入类型转换。- 擦除示例:  
<JAVA>
// 源码 List<String> list = new ArrayList<>(); String s = list.get(0);// 编译后的等效代码(类型擦除) List list = new ArrayList(); // 类型擦除为原始类型List String s = (String) list.get(0); // 插入强制转换 
 - 擦除示例:  
 
2. 桥方法(Bridge Method)
- 作用:确保泛型类在继承和多态中能正确调用类型擦除后的方法。
 - 示例:泛型类继承时,编译器自动生成桥方法保持多态性。
 
四、泛型应用场景
1. 集合框架
- 泛型在集合中的典型应用:  
<JAVA>
List<String> names = new ArrayList<>(); // 安全存储字符串 Map<Integer, String> idToName = new HashMap<>(); 
2. 通用工具类/方法
- 编写与具体类型解耦的工具逻辑:  
<JAVA>
public static <T> T getFirst(List<T> list) {return list.isEmpty() ? null : list.get(0); } 
3. 回调接口
- 定义泛型回调接口:  
<JAVA>
public interface Callback<T> {void onSuccess(T result);void onFailure(String error); } 
4. 泛型与反射
- 通过反射获取泛型实际类型(需借助
ParameterizedType):<JAVA>
Type type = new TypeToken<List<String>>(){}.getType(); // Guava库常用 
五、泛型限制与注意事项
-  
类型参数不能是基本类型:
<JAVA>
// 错误示例 List<int> list = new ArrayList<>(); // 需使用包装类Integer -  
无法实例化泛型类型:
<JAVA>
T instance = new T(); // 编译错误 -  
静态成员不能使用类型参数:
<JAVA>
class Box<T> {// static T data; // 错误 } -  
泛型数组的限制:
<JAVA>
// 不能直接创建泛型数组 // T[] array = new T[10]; // 错误 // 可通过反射或强制类型转换实现(存在风险) T[] array = (T[]) new Object[10]; -  
泛型与异常:
- 不能抛出或捕获泛型类的实例。
 - 泛型类不能直接或间接继承
Throwable。 
 
六、高级泛型特性
1. 递归类型边界(Recursive Type Bound)
- 限制类型参数为当前类的子类:  
<JAVA>
public class Node<T extends Comparable<T>> {// T必须实现Comparable<T>接口 } 
2. 类型推断(Type Inference)
- 编译器自动推导泛型类型:  
<JAVA>
List<String> list = Collections.emptyList(); // Java 7+可推断为List<String> 
七、常见问题与解决方案
-  
如何获取泛型的实际类型?
- 通过子类化
TypeToken(Guava库)或反射捕获类型:<JAVA>
Type type = ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; 
 - 通过子类化
 -  
何时使用
List和List<?>?List:原始类型(存在类型不安全警告)。List<?>:未知类型的集合(只能读取为Object,不能添加元素)。
 
总结
泛型是Java类型系统的核心机制,通过合理使用可大幅提升代码的安全性和可维护性。重点需掌握:
- 通配符的上下界用于灵活设计API;
 - 类型擦除理解底层限制;
 - 泛型与集合、工具类的结合提升代码复用率。
 
