泛型类用统一约束容器及内部ArrayList,确保类型安全;需声明私有ArrayList、提供add/get/size等方法,避免暴露实现细节;构造与赋值须保持Data实例一致性,并可扩展初始容量和类型边界约束。

泛型类搭配 ArrayList 封装自定义数据容器,核心是用类型参数统一约束“容器本身”和“内部存储结构”,让整个类既安全又通用。关键不在堆砌语法,而在明确谁管类型、谁管行为、谁负责边界。
明确泛型类的类型参数作用域
泛型类的类型参数(如
- 错误写法:
class MyContainer { private ArrayList<object> list = new ArrayList(); }</object>—— 失去类型约束,退化为原始类型操作 - 正确写法:
class MyContainer<t> { private ArrayList<t> list = new ArrayList(); }</t></t>—— T 同时约束了 list 的元素类型和后续所有 add/get 的入参/出参
封装时让 ArrayList 成为私有实现细节
不要把 ArrayList 直接暴露为 public 字段或返回原生引用。用户只需知道“能存 T、能取 T、能查数量”,不必关心底层是不是数组、是否扩容、是否同步。
在调试 Java 后端 API 故障时使用此技能,尤其适用于以下任务:分析日志、跨 Controller、Service 和 Mapper 层追踪请求、定位异常根因、检查 SQL 执行或参数流转,以及生成简洁的诊断结论与修复方案。
- 用 private ArrayList
data 存储,不提供 getter 返回该引用(防止外部绕过你的逻辑直接操作) - 对外提供 add(T item)、get(int index): T、size(): int 等语义清晰的方法
- 若需遍历,优先提供增强 for 支持(实现 Iterable
),而不是暴露 iterator() 方法
处理自定义对象时注意构造与赋值一致性
当你用 MyContainer 时,“Data 必须可实例化”且“add 传入的必须是 Data 实例”。常见错误不是语法错,而是逻辑断层:
立即学习“Java免费学习笔记(深入)”;
- 忘记写 Data 类的 public 构造方法,导致 new Data(...) 失败
- 在 add 中传入 new String("abc") 或 123,编译直接报错:类型不匹配
- 正确流程:先定义
Data d = new Data("张三", 25);,再调用container.add(d);
可选增强:支持初始化容量与类型约束延伸
实际封装中,常需控制初始大小或限定 T 的范围。这两点都可通过泛型机制自然支持:
- 添加带参构造:
public MyContainer(int initialCapacity) { this.data = new ArrayList(initialCapacity); } - 限制 T 必须有无参构造(便于内部创建):
class MyContainer<t extends data cloneable></t>,这样 T 就既是 Data 子类,又可克隆 - 若需默认值支持,可配合静态工厂方法:
public static <t> MyContainer<t> empty() { return new MyContainer(); }</t></t>

















