Java泛型方法通过编译期类型推断与约束保障类型安全,需用<T>声明类型参数,支持extends限定能力,集合操作优先使用通配符,且须规避运行时擦除导致的instanceof、new T[]等非法操作。

Java 中使用泛型方法在不确定类型时提供类型安全的通用支持,核心是把“类型”变成编译期可推断、可约束的参数,让同一段逻辑适配 String、Integer、User 等不同引用类型,且错误在写代码时就被拦住,而不是运行时报 ClassCastException。
定义泛型方法必须显式声明类型变量
泛型方法签名前要加 <T> 这样的类型参数声明,它不是具体类名,而是占位符。例如:
- 正确写法:public static <T> T getFirst(List<T> list) —— 编译器能从 list 推出 T 是什么类型
- 错误写法:public static void log() { ... } —— 没有 T 出现在参数或返回值里,编译器无法推断,T 就是未定义符号
常用单字母命名:T(Type)、E(Element)、K/V(Key/Value)。多个类型可并列,如 <K, V> Map<K, V> toMap(List<K> keys, List<V> values)。
用 extends 约束能力,避免调用非法方法
如果方法内部要调用 .compareTo() 或 .doubleValue(),就不能只写 <T>,得说明 T 至少得具备这些能力:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 找最大值:public static <T extends Comparable<T>> T max(T[] arr) —— 保证每个元素能比较
- 求和:public static double sum(List<? extends Number> nums) —— 支持 Integer、Double、BigDecimal
- 多个限制:<T extends Runnable & AutoCloseable> 表示 T 必须同时实现两个接口
处理集合参数时优先用通配符,别锁死具体类型
方法接收集合时,别硬写 List<String> 或 List<Object>,改用通配符提升灵活性与安全性:
- 只读场景(安全读取):List<? extends Person> —— 可传入 List<Student> 或 List<Teacher>
- 只写场景(安全插入):Collection<? super Integer> —— 可接受 Collection<Number> 或 Collection<Object>
- 避免 List<?> 或 List<Object>:前者失去类型信息,后者失去编译检查
绕开类型擦除带来的常见陷阱
泛型只在编译期存在,运行时 T 已被擦成 Object 或上界类型,所以这些操作不可行:
- ❌ if (obj instanceof T) —— 编译不通过,T 在运行时不存在
- ❌ new T[10] —— 改用 (T[]) new Object[10],并加 @SuppressWarnings("unchecked")
- ❌ 静态字段直接用类级泛型参数(如 static T DEFAULT)—— 静态属于类,泛型属于实例,不兼容
- ✅ 替代方案:传入 Class<T> 对象,用 clazz.cast(obj) 或 clazz.getDeclaredConstructor().newInstance()

















