泛型方法通过声明类型参数<T>约束集合元素类型,使用Collection<T>或Iterable<T>作为参数类型确保类型安全;T由实参推断,支持安全遍历与操作;需避免原始类型、强制转型及new T[],数组转换应借助模板数组。

在泛型方法中接收并处理任意类型的集合对象,关键在于用类型参数统一约束集合元素类型,同时借助 Iterable 或具体集合接口(如 List<T>、Collection<T>)声明形参,避免使用原始类型或 Object。
用泛型参数定义方法签名
泛型方法需在返回类型前声明类型变量,例如 <T>,再用该变量限定集合参数类型。这样既能接收 List<String>、ArrayList<Integer> 等不同实参,又能保证内部操作类型安全:
- 方法声明格式:
public <T> void process(Collection<T> items) -
T在调用时由传入集合的实际元素类型推断,比如传new ArrayList<Double>(),则T就是Double - 方法体内可直接使用
T做变量声明、参数传递或返回,无需强转
推荐使用 Collection<T> 或 Iterable<T> 作参数类型
比起写死为 ArrayList<T> 或 LinkedList<T>,应选择更通用的顶层接口:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
Collection<T>覆盖大多数集合实现,支持size()、isEmpty()、增强 for 循环等常用操作 -
Iterable<T>更宽泛,连数组包装类(如Arrays.asList()返回值)和自定义迭代器都能适配 - 避免用
Object或原始集合(如Collection)——会丢失类型信息,导致运行时转换风险
处理逻辑要与类型参数保持一致
方法体内的操作需围绕 T 展开,不能假定它是某种具体类型,除非额外加限制:
立即学习“Java免费学习笔记(深入)”;
- 安全操作:遍历、统计数量、存入新集合、调用
toString()或equals()(因所有类都继承自Object) - 若需调用特定方法(如
length()),应使用上界限定,例如<T extends CharSequence>,此时T只能是String、StringBuilder等 - 不建议在泛型方法内做
instanceof判断或强制转型——违背泛型设计初衷,也绕过编译检查
注意数组与集合转换的边界
如果方法需要返回数组,不能直接创建 new T[n](因泛型擦除,编译不通过),正确做法是让调用方传入类型数组作为模板:
- 签名示例:
public <T> T[] toArray(Collection<T> input, T[] template) - 内部调用
input.toArray(template),利用模板数组的运行时类型构造结果 - 调用时写法:
String[] arr = toArray(list, new String[0])

















