泛型通过将类型作为参数实现通用逻辑一次编写、多处复用,如genericdao统一处理不同实体的增删查改,结合类型边界(如t extends identifiable)保障契约与安全,泛型方法(如getordefault)进一步降低样板代码粒度。

泛型让通用逻辑一次编写,多处复用
传统方式下,为不同实体写 DAO、Service 或容器类,往往要复制粘贴大量结构相似的代码。比如 UserDAO、OrderDAO、ProductDAO,增删查改逻辑几乎一样,只是操作的实体类型不同。泛型把“类型”变成参数,用一个 GenericDAO
泛型 DAO 是最典型的复用实践
定义一个泛型 DAO 接口,所有方法都基于类型参数 T:
- public T findById(Long id) —— 返回具体实体,无需强制转换
-
public List
findAll() —— 返回对应类型的列表,调用方直接拿到 User 列表,不是 List - public void save(T entity) —— 接收任意符合约束的实体,内部通过反射或注解提取字段
实现类继承时指定基类或接口约束(如 class JpaDAO
泛型结合继承与约束,复用更精准
单纯用 T 还不够灵活,加上类型边界就能控制复用范围:
-
:确保所有传入类型都有 getId() 方法,方便统一做主键操作 -
:要求类型可序列化且支持克隆,适合缓存或远程传输场景 - 配合泛型接口 + 抽象基类,可把分页、软删除、审计字段等横切逻辑抽到父类,子类只专注业务字段映射
这样复用的不是“能跑就行”的模板,而是带契约、可验证、易测试的组件。
泛型方法进一步降低重复编码粒度
不一定要整个类泛型化。一个工具方法也能显著减少样板代码:
-
public static
T getOrDefault(Map —— 一处定义,所有 Map 类型都能用map, String key, T defaultValue) -
public static
List —— 替代为 String、Integer、User 各写一个 filter 方法filterBy(Predicate condition, Collection items) - 这类方法在工具类中集中维护,团队共享,修改一次,全局生效
它把“对某类数据做某事”的抽象提升到语言层面,而不是靠命名约定(如 filterUsersByStatus、filterOrdersByStatus)来模拟通用性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











