java中抽象类配合泛型实现通用基类,核心是类级泛型参数统一约束字段、方法和子类类型,避免object强转;需显式传入class支持反射操作;通过抽象方法定义契约,泛型方法提供扩展口;子类可固定类型或转发泛型。

Java 中用抽象类配合泛型实现通用基类,核心是把类型可变的部分交给泛型参数,把逻辑不变的部分封装在抽象类里。子类继承时指定具体类型,就能复用增删查、校验、遍历等通用能力,同时保留定制空间。
泛型声明必须放在类级别
不能只在方法上加 <t></t>,否则字段、构造器、子类无法统一约束类型。正确写法:
abstract class BaseService<t> { protected T data; public abstract void handle(T item); }</t>- 字段
data、参数T item、返回值都能保持类型一致 - 避免用
Object+ 强转,失去编译期类型检查
让子类传入运行时类型信息
泛型在运行时被擦除,若需反射或 ORM 操作(如获取表名、主键字段),得靠 Class<t></t> 显式传递:
- 子类构造器中传入:
super(User.class); - 抽象基类保存:
protected final Class<t> entityClass;</t> - 后续可用
entityClass.getSimpleName()或entityClass.getDeclaredMethod("getId")等
抽象方法定义行为契约,泛型方法留扩展口
通用逻辑写死,变化点交由子类决定:
- 抽象方法直接用类级泛型:
public abstract boolean isValid(T item);—— 子类实现具体校验规则 - 泛型方法支持灵活转换:
public <r> R mapTo(Function<t r> mapper) { return mapper.apply(data); }</t></r> - 不写
if (item instanceof String)这类判断,破坏抽象性
子类继承有两种典型方式
根据使用场景选择固定类型还是继续开放泛型:
- 专用子类:直接绑定类型,如
class UserCache extends Cache<string> { ... }</string> - 通用子类:转发泛型,如
class GenericStack<t> extends Stack<t> { ... }</t></t>,调用方决定T - 构造器中不能
new T(),需用Supplier<t></t>或传入Class<t></t>配合反射
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











