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

在泛型方法中接收并处理任意类型的集合对象,关键在于用类型参数统一约束集合元素类型,同时借助 Iterable 或具体集合接口(如 List<t></t>、Collection<t></t>)声明形参,避免使用原始类型或 Object。
用泛型参数定义方法签名
泛型方法需在返回类型前声明类型变量,例如 <t></t>,再用该变量限定集合参数类型。这样既能接收 List<string></string>、ArrayList<integer></integer> 等不同实参,又能保证内部操作类型安全:
- 方法声明格式:
public <t> void process(Collection<t> items)</t></t> -
T在调用时由传入集合的实际元素类型推断,比如传new ArrayList<double>()</double>,则T就是Double - 方法体内可直接使用
T做变量声明、参数传递或返回,无需强转
推荐使用 Collection 或 Iterable 作参数类型
比起写死为 ArrayList<t></t> 或 LinkedList<t></t>,应选择更通用的顶层接口:
-
Collection<t></t>覆盖大多数集合实现,支持size()、isEmpty()、增强 for 循环等常用操作 -
Iterable<t></t>更宽泛,连数组包装类(如Arrays.asList()返回值)和自定义迭代器都能适配 - 避免用
Object或原始集合(如Collection)——会丢失类型信息,导致运行时转换风险
处理逻辑要与类型参数保持一致
方法体内的操作需围绕 T 展开,不能假定它是某种具体类型,除非额外加限制:
- 安全操作:遍历、统计数量、存入新集合、调用
toString()或equals()(因所有类都继承自Object) - 若需调用特定方法(如
length()),应使用上界限定,例如<t extends charsequence></t>,此时T只能是String、StringBuilder等 - 不建议在泛型方法内做
instanceof判断或强制转型——违背泛型设计初衷,也绕过编译检查
注意数组与集合转换的边界
如果方法需要返回数组,不能直接创建 new T[n](因泛型擦除,编译不通过),正确做法是让调用方传入类型数组作为模板:
- 签名示例:
public <t> T[] toArray(Collection<t> input, T[] template)</t></t> - 内部调用
input.toArray(template),利用模板数组的运行时类型构造结果 - 调用时写法:
String[] arr = toArray(list, new String[0])
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











