泛型方法通过类型参数实现集合工具的通用性,声明时置于返回类型前,调用时由编译器推断具体类型,并配合通配符(? extends t、? super t)和反射提升复用性与灵活性。

泛型方法结合集合类实现通用工具方法,核心在于用类型参数替代具体类型,让同一段逻辑能安全适配 List<string></string>、List<user></user>、Set<integer></integer> 等任意集合。它不是“写一堆重载方法”,而是靠编译器在调用时推断类型,自动完成类型检查和擦除后的桥接。
泛型方法怎么声明和调用
泛型方法的声明必须在返回类型前加类型参数,比如 <t> List<t> filterNull(List<t> list)</t></t></t>。这里的 T 是占位符,不代表某个固定类,而是在每次调用时由传入的实际参数决定:
- 调用
filterNull(new ArrayList<string>())</string>→T就是String - 调用
filterNull(Arrays.asList(new User(), new User()))→T就是User
编译器会据此校验:不能往这个 List<t></t> 里塞 Integer,取出来的元素也直接是 T 类型,不用强转。
常用集合工具方法的泛型写法
Java 标准库里的 Collections 类就是典型范例,所有静态方法都带泛型声明:
-
public static <t> boolean addAll(Collection super T> c, T... elements)</t>:支持向任意可接受T或其父类的集合批量添加元素 -
public static <t> void sort(List<t> list, Comparator super T> c)</t></t>:只要T能被指定比较器处理,就能排序 -
public static <t> List<t> unmodifiableList(List extends T> list)</t></t>:返回只读视图,且保证取出的仍是T或其子类
自己写时也照这个模式:先确定输入输出的集合类型,再用通配符(? extends T 表示“上界”,? super T 表示“下界”)放宽约束,提升复用性。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
手写一个真正有用的泛型工具方法
比如“从集合中提取某字段值构成新列表”,不依赖第三方库,仅用反射 + 泛型:
public static <t r> List<r> pluck(List<t> list, String fieldName) {
if (list == null || list.isEmpty()) return new ArrayList();
List<r> result = new ArrayList();
try {
Field field = list.get(0).getClass().getDeclaredField(fieldName);
field.setAccessible(true);
for (T item : list) {
result.add((R) field.get(item));
}
} catch (Exception e) {
throw new RuntimeException("字段提取失败: " + fieldName, e);
}
return result;
}</r></t></r></t>
调用示例:pluck(users, "name") 返回 List<string></string>,pluck(orders, "amount") 返回 List<bigdecimal></bigdecimal>。这里 <t r></t> 两个参数分别代表源对象类型和目标字段类型,比单泛型更灵活。
为什么不能只靠泛型,还得配合通配符和反射
纯泛型只能解决“同一种类型来回传”的问题;但真实场景常要混用:
- 想把
List<dog></dog>当作List<animal></animal>用?得用? extends Animal - 想把
List<object></object>安全接收List<string></string>?得用? super String - 想动态读取任意对象的任意字段?泛型本身不提供结构信息,必须靠反射去查
Class和Field
泛型管“类型安全”,反射管“结构探知”,通配符管“类型兼容”,三者在集合工具方法里经常协同出现。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










