Java泛型转换器通过接口Converter<T,R>在编译期明确类型边界,支持Lambda快速实现、Map统一管理、Spring条件注册及Stream批量转换,兼顾类型安全与简洁性。

Java 接口结合泛型实现通用转换器,关键在于用类型参数明确输入与输出边界,避免 Object 透传和运行时类型错误。核心不是写一堆 if-else 或 instanceof,而是通过接口契约把“从什么转成什么”这件事在编译期就定下来。
定义泛型转换接口
接口只声明一个抽象方法,输入类型 T 和输出类型 R 分开指定,不强求一致:
- 用
public interface Converter<T, R> { R convert(T source); } - 泛型必须写在接口上(不是方法上),否则 Lambda 无法正确推断,且破坏函数式接口语义
- 这个接口天然支持 String→Integer、Map→DTO、LocalDateTime→String 等任意组合
用 Lambda 或方法引用快速实现
不用为每个转换都写一个类,直接用一行代码搞定:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
Converter<String, Integer> str2int = Integer::parseInt;Converter<User, String> getName = User::getName;Converter<Long, Date> long2date = Date::new;- 带逻辑的也简单:
Converter<String, Boolean> notEmpty = s -> s != null && !s.trim().isEmpty();
统一管理多种转换器
把不同类型的转换器存进 Map,按需获取,避免硬编码或重复 new:
立即学习“Java免费学习笔记(深入)”;
- 用
Map<Class<?>, Map<Class<?>, Converter<?, ?>>>两级索引(源类型 → 目标类型 → 转换器) - 注册时做类型安全检查:
registry.register(String.class, Integer.class, Integer::parseInt); - 调用时自动匹配:
converter = registry.get(String.class, Integer.class); result = converter.convert("123"); - 配合 Spring 的
@ConditionalOnMissingBean,可内置默认实现,允许业务方按需覆盖
搭配 Stream 批量转换更自然
泛型接口和 Java 8+ 的函数式特性天然契合,处理集合非常简洁:
public static <S, R> List<R> convertAll(Collection<S> list, Converter<S, R> converter) { return list.stream().map(converter::convert).collect(Collectors.toList()); }- 调用:
List<Integer> nums = convertAll(Arrays.asList("1","2","3"), Integer::parseInt); - 比手写 for 循环 + try-catch 更安全,比 Apache Commons 工具类更可控、无反射开销

















