java泛型适配器模式核心是用单泛型抽象源类型,聚焦“怎么转”,目标格式固定或由接口抽象;适配器应持有数据并复用逻辑,配合泛型方法绕过类型擦除,避免盲目使用双泛型。

Java中泛型适配器模式的核心,是让一个适配器能处理多种类型的数据转换,而不用为每种类型写一个新类。关键不在于“Adapter”这种双泛型写法本身多炫酷,而在于它如何把类型安全和行为解耦真正落地。
用泛型定义适配逻辑的契约
先明确一点:适配器要转换的不是“数据”,而是“数据到目标格式的映射规则”。所以泛型参数通常只用一个(T),代表被转换的源类型;目标格式(比如String)往往是固定的,或由另一个接口抽象。
- 定义泛型适配器接口,聚焦“怎么转”: public interface MsgAdapter
{ String adapt(T data); } - 实现时类型具体化,比如转Student对象:new MsgAdapter
() { public String adapt(Student s) { return "{\"name\":\"" + s.getName() + "\"}"; } } - 这样调用方传入任意 Student 实例,都能得到标准JSON字符串,且编译期就检查类型——不会把 String 误传给期望 Student 的适配器
让适配器持有真实数据,而非仅做静态转换
很多初学者误以为泛型适配器就是“写个方法完事”,其实真正的灵活性来自运行时绑定数据+复用适配逻辑。典型做法是让适配器内部持有一个泛型字段:
- public class JsonAdapter
implements MsgAdapter { private final Function converter; public JsonAdapter(Function converter) { this.converter = converter; } @Override public String adapt(T data) { return converter.apply(data); } } - 使用时可复用同一适配器实例:MsgAdapter
userAdapter = new JsonAdapter(u -> u.toJson()); MsgAdapter orderAdapter = new JsonAdapter(o -> o.toCompactJson()); - 这样既避免重复写 adapt() 方法体,又保留了对每种类型定制序列化逻辑的能力
配合目标接口,实现类型擦除下的安全转发
泛型适配器常与泛型方法配合,绕过 Java 类型擦除限制。例如消息发送器接口:
- public interface IMsgSender {
void send(T data, MsgAdapter adapter); } - 实现类里无需强制转型:public
void send(T data, MsgAdapter adapter) { String msg = adapter.adapt(data); // 直接调用,类型已由泛型约束保证 safeSystem.out.println(msg); } - 调用时编译器自动推断 T:sender.send(new User("Alice"), userAdapter); // T 就是 User,不会错传成 List
避免常见误区:不是所有地方都需要双泛型
看到别人写 Adapter 就跟着套用,容易画蛇添足。除非你真需要同时抽象“源类型”和“目标类型”(比如通用类型转换器库),否则多数业务场景中:
- 目标格式固定(如统一转 String 或 byte[]),只需泛化源类型
- 若目标也变(如 T → JSON / XML / Protobuf),应拆成不同适配器实现,而不是堆泛型参数
- 强行用
反而让调用方难写、难读、难维护——比如 new Adapter>() 这种嵌套泛型,实际价值很低
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











