PECS原则在备忘录模式中不直接适用,但扩展泛型容器管理状态快照时至关重要:保存用? super State确保可写入各类子类,恢复用? extends State保障可安全读取为State,双向操作则应弃用通配符改用具体类型。

PECS 原则在备忘录模式(Memento)中不直接适用,因为标准 Memento 模式本身通常不涉及泛型集合操作或通配符类型约束。但若你将 Memento 与泛型容器(如 List<? extends T> 或 List<? super T>)结合使用来统一管理多种状态快照,PECS 就会成为关键设计依据。
保存状态时适合用 ? super State
当设计一个通用的状态归档器(如 StateArchive),需要向其中添加各种具体状态对象(GameMemento、EditorMemento 等),而它们都继承自公共基类 State,此时应声明为:
-
List<? super State> archive—— 允许调用archive.add(new GameMemento()),因为所有子类都能安全向上转型为State - 不能用
? extends State,否则add()编译失败:编译器无法确认实际类型是State还是某个未知子类,禁止写入 - 读取时只能得到
Object,需手动转型;若需类型安全读取,应改用泛型方法而非通配符
恢复状态时适合用 ? extends State
当你只从归档中读取、不修改(例如遍历所有快照做回滚预览),且希望返回值能被统一当作 State 使用,就该用上界:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
-
List<? extends State> snapshots—— 可安全调用snapshots.get(0),结果可赋给State s = ... - 不能用
? super State,因为读出的对象类型不确定(可能是Object或更宽泛父类),无法直接当State用 - 此时禁止
add()或set(),符合“只读即生产者”的语义
实际场景中的典型误用
常见错误是试图用同一泛型引用既存又取:
立即学习“Java免费学习笔记(深入)”;
-
List<? extends State> list→ 可读不可写,恢复可用,保存失败 -
List<? super State> list→ 可写不可安全读,保存可用,恢复时需强转,易出错 - 真正需要读写双向操作时,应放弃通配符,直接用具体类型:
List<State>或泛型类<T extends State>
备忘录模式本身关注封装和不可变性,PECS 不是它的内置规则,而是你在扩展其类型能力时,用来守住泛型安全边界的实用指南。

















