read()方法本质是生产者,应使用? extends t确保安全产出t及子类实例;write()方法本质是消费者,应使用? super t确保宽泛容纳t及子类对象,构成类型安全的序列化/反序列化管道。

PECS 原则在 Gson 的 TypeAdapter<t></t> 实现中并不直接暴露为泛型通配符参数,但它深刻影响着你如何安全地定义、复用和组合 TypeAdapter —— 尤其在涉及继承体系(如 JSON 反序列化为多态类型)时,读(read)和写(write)行为天然对应“生产者”与“消费者”,必须按 PECS 约束设计泛型边界。
read() 方法本质是生产者:应使用 extends T>
TypeAdapter<t>.read(JsonReader)</t> 从 JSON 流中解析出一个 T 类型实例。它向外“产出”数据,调用方期望得到的是 T 或其子类对象(比如你传入 TypeAdapter<fruit></fruit>,实际可能返回 Apple 或 Banana)。此时:
- 方法签名是
T read(JsonReader in) throws IOException,返回值类型固定为T,编译器保证类型安全 - 如果你要编写一个通用反序列化器(例如支持所有
Fruit子类),不能直接写TypeAdapter extends Fruit>—— 因为TypeAdapter是具体类,不是容器;但你在注册或委托时需遵循 PECS 逻辑 - 典型做法:用
TypeAdapterFactory根据 JSON 字段动态选择子类适配器,每个子类适配器的read()返回具体子类型(Apple),而统一入口接收TypeAdapter<fruit></fruit>—— 这隐含了“生产者产出 ≥ Fruit”的语义,符合? extends Fruit的安全读取原则
write() 方法本质是消费者:应使用 super T>
TypeAdapter<t>.write(JsonWriter, T value)</t> 接收一个 T 类型对象并写入 JSON。它向外部“消费”数据,必须能接受 T 及其所有子类(比如 TypeAdapter<fruit></fruit> 应能写 Apple、Banana,甚至 RedApple)。此时:
- 参数
T value是输入,要求适配器具备向下兼容能力 —— 这正是? super T的用途:声明“我至少能处理T及其子类” - Gson 源码中虽未显式用
super T>修饰write参数(因泛型擦除和 API 设计历史),但你在自定义适配器时若需泛型复用,应主动约束类型参数。例如:
public class FruitTypeAdapter extends TypeAdapter<fruit> {</fruit> @Override public void write(JsonWriter out, Fruit value) throws IOException { // value 可能是 Apple/Banana,但类型擦除后仍安全 }}
组合多个 TypeAdapter 时 PECS 必须显式体现
当你用 Factory 创建适配器,或通过 GsonBuilder.registerTypeAdapter() 注册时,若涉及泛型委托,PECS 边界就变得关键:
- 委托读操作(生产):用
TypeAdapter extends T>接收子类适配器,确保只读不写 - 委托写操作(消费):用
TypeAdapter super T>接收父类适配器,确保能写入子类实例 - 错误示例:
void setWriter(TypeAdapter<fruit> writer)</fruit>看似没问题,但若传入TypeAdapter<apple></apple>就编译失败 —— 因为TypeAdapter<apple></apple>≠TypeAdapter<fruit></fruit>;正确应为void setWriter(TypeAdapter super Fruit> writer)
为什么 Gson 自身 API 没大量用 extends / ? super>?
主要受制于两点:
-
类型擦除:运行时泛型信息丢失,Gson 依赖
TypeToken和反射绕过限制,而非靠编译期通配符约束 -
API 稳定性与易用性:公开接口若强制用户写
TypeAdapter super Fruit>,反而增加认知负担;Gson 选择在内部工厂和委托逻辑中隐式遵循 PECS,对外暴露简洁的TypeAdapter<t></t> - 但你在扩展时(如实现
TypeAdapterFactory),若忽略 PECS,极易出现“无法传入子类适配器”或“写入时类型不匹配”的编译错误
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











