泛型抽象类通过在类级别声明类型参数t实现类型安全与子类定制,需定义泛型类而非泛型方法,字段和方法直接使用t,可加类型边界,封装通用逻辑并开放抽象方法,子类可固定类型或转发泛型继承。

在抽象类中用泛型定义通用数据结构,核心是把类型参数 T 声明在类级别,让整个类的字段、方法、逻辑都围绕这个类型展开,既保证类型安全,又留出子类定制空间。
泛型抽象类的基本写法
必须在类声明处定义类型参数,不能只放在某个方法里:
- 写成 abstract class Container
,不是 abstract class Container 再加泛型方法 - 字段可直接用 private T data、protected List
items - 方法签名如 public void add(T item)、public T get(int index),避免用 Object + 强转
- 若需类型能力(比如排序),加上边界:abstract class SortedContainer
>
封装通用逻辑,开放可变行为
抽象类负责“不变”的部分,比如增删查、遍历、空值校验;把“会变”的部分交给子类实现:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 通用方法直接写死:public final void clear() { items.clear(); }
- 抽象方法交由子类决定:public abstract boolean isValid(T item);
- 不写 if (item instanceof String) 这类判断,破坏抽象性;改用策略传入,比如 public void setValidator(Predicate
validator)
子类继承的两种常见方式
子类怎么用这个泛型抽象类,决定了它的复用粒度:
-
固定类型实现:如 class IntStack extends Container
,所有方法操作 Integer,适合专用容器 -
转发泛型实现:如 class GenericStack
extends Container ,保持开放,调用方决定 T,适合通用工具类 - 构造器中若需创建默认值,不能写 new T(),得靠 Class
或 Supplier 传入
典型场景示例
比如一个缓存基类:
- abstract class Cache
{ protected Map store; public abstract V load(K key); } - 子类可写成 class LRUCache
extends Cache 或 class FileBackedCacheextends Cache - 所有子类自动获得 put(K, V)、get(K) 等通用方法,无需重复编码
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










