泛型接口实现类的类型由使用方式决定:业务单一则写死具体类型,如class UserRepo implements Repository;需复用则实现类泛型化,如class JsonConverter implements Converter;子接口继承须当场定型,静态成员不可引用类型参数T。

泛型接口的实现类类型不是由接口决定的,而是由你打算怎么用这个实现类来决定的。核心就一条:接口留白,实现填空;填什么,看职责。
业务单一就写死具体类型
如果这个类只处理一种数据,比如用户管理模块里的仓库,那就直接在 implements 后面写明类型:
-
class UserRepo implements Repository
—— 所有方法天然绑定 User,IDE 提示准,编译检查严,别人一看就知道这是干啥的 - 不能写成 class UserRepo implements Repository(原始类型,丢掉泛型安全)
- 也不能写成 class UserRepo
implements Repository (类带泛型但没用上,纯属冗余)
需要复用就让实现类也泛型化
如果这个实现是通用组件,比如 JSON 转换器、事件处理器,要适配 String、Order、Product 等多种类型,那就把类本身声明为泛型:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
-
class JsonConverter
implements Converter —— T 是类的形参,也是接口的实参,链条清晰 - 创建对象时才确定具体类型:new JsonConverter
() - 不能混用名字,比如 class JsonConverter implements Converter
—— 编译不通过
父接口继承时必须当场定型
子接口扩展泛型接口,不能继续泛化,得立刻把父接口的类型参数填上:
- ✅ 允许:interface UserProcessor extends Processor
- ❌ 不允许:interface GenericProcessor
extends Processor (这不是继承,是重定义)
静态成员不能碰类型参数
无论实现类是泛型还是非泛型,静态方法或静态字段都不能引用接口的类型参数 T:
- 接口里有 T getValue(),你可以在实例方法里用 T
- 但不能写 private static T cache; 或 public static void log(T t) —— 类型参数在运行时不存在,静态上下文不认

















