实现“双能通道”的关键是定义两个对称的泛型函数式接口ForwardConverter<T,R>和BackwardConverter<R,T>,再通过泛型类BiwayChannel<T,R>封装二者,提供forward()和backward()方法,并辅以静态工厂方法支持类型推断。

要实现支持双向类型转化的“双能通道”,关键不是堆砌泛型参数,而是用两个独立但对称的函数式接口分别封装正向与反向逻辑,并通过一个泛型容器类把它们组织起来。这样既保持类型安全,又避免单个接口承担过多职责。
定义一对对称的泛型函数式接口
不要试图在一个接口里塞两个抽象方法(那就不叫函数式接口了)。正确做法是定义两个独立接口,各自专注一个方向:
-
ForwardConverter<T, R>:负责
T → R,抽象方法如R convert(T input) -
BackwardConverter<R, T>:负责
R → T,抽象方法如T revert(R output)
两者泛型参数顺序相反,语义清晰。都标注 @FunctionalInterface,支持 Lambda 直接实现,例如:
ForwardConverter<String, Integer> str2int = Integer::parseInt; BackwardConverter<Integer, String> int2str = Object::toString;
用泛型通道类封装双向能力
定义一个泛型类 BiwayChannel<T, R>,持有一对转换器实例:
立即学习“Java免费学习笔记(深入)”;
- 构造时传入两个 Lambda 或方法引用,类型自动推断
- 提供
forward(T)和backward(R)两个公有方法,调用对应转换器 - 不暴露内部函数式接口,对外只呈现“通道”语义
示例结构:
public class BiwayChannel<T, R> {
private final ForwardConverter<T, R> forward;
private final BackwardConverter<R, T> backward;
public BiwayChannel(ForwardConverter<T, R> forward,
BackwardConverter<R, T> backward) {
this.forward = forward;
this.backward = backward;
}
public R forward(T input) { return forward.convert(input); }
public T backward(R output) { return backward.revert(output); }
}
支持自动推断与复用的实用技巧
让使用方写得更简洁,可加一个泛型静态工厂方法:
-
BiwayChannel.of(str2int, int2str)—— 编译器能根据两个参数自动推断T=String、R=Integer - 避免手动写
new BiwayChannel<String, Integer>(…)这种冗长写法 - 若某组转换常被复用(如
LocalDateTime ↔ String),可封装为静态常量或工具类方法
注意边界与限制
双向转换未必总可逆,设计时需明确契约:
- 不强制要求
backward(forward(x)) ≡ x,但应在文档中说明是否满足(比如浮点转字符串可能丢失精度) - 若反向转换逻辑依赖正向结果(如带格式信息),可在
BackwardConverter的实现中捕获上下文,而非强行塞进泛型参数 - 避免泛型参数超过三个——
<T, R, Ctx>已接近可读性临界点,此时建议拆分为专用类


















