Java泛型接口的类型参数必须在实现时明确指定:非泛型实现类在implements中写死具体类型;泛型实现类需声明相同类型参数并透传;子接口继承须立即固化父接口类型;混合固化可部分固定、部分保留泛型。

Java 泛型接口本身不绑定具体类型,它的类型参数必须在**被实现时明确指定**——不是在接口定义里填,而是在实现类的 implements 语句中写死,或者由实现类自身携带并透传。
非泛型实现类:直接在 implements 中写具体类型
当你确定这个类只处理某一种类型(比如只操作 User 或 String),就让实现类变成普通类,把接口的类型参数当场“填空”:
- 接口定义:
interface Repository<T> { T findById(Long id); void save(T obj); } - 实现类写法:
class UserRepo implements Repository<User> - 此时所有方法签名自动变为
User findById(Long)、void save(User),编译器强制校验,IDE 提示精准,调用方无需再指定类型 - 不能写成
class UserRepo implements Repository(省略类型),否则T默认退化为Object,失去泛型意义
泛型实现类:类声明带类型参数,并透传给接口
当这个实现需要适配多种类型(比如通用缓存工具、JSON 转换器),就让实现类也保持泛型,把类型参数原样交给接口:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- 写法:
class GenericConverter<T> implements Converter<T> - 接口中的
T和类声明的T是同一个形参,不是重名巧合;名称必须一致,不能写成<U> implements Converter<T>(编译报错) - 使用时才绑定具体类型:
new GenericConverter<Order>(),整个链条从实例创建起就类型确定 - 适合放在基础包或框架层,供多个业务模块复用
子接口继承时:必须立即确定父接口类型
如果想基于已有泛型接口扩展新接口,不能继续泛化,而是要当场固化父接口的类型参数:
立即学习“Java免费学习笔记(深入)”;
- 允许:
interface UserProcessor extends Processor<User>(直接指定User) - 不允许:
interface GenericProcessor<T> extends Processor<T>(这不是继承,是重新定义一个新泛型接口) - 这样做的好处是语义清晰:子接口就是专为
User设计的契约,所有实现者天然受限于该类型
混合固化:部分类型固定,部分保留泛型
有些场景可以折中——输入类型已知,输出类型仍需开放:
- 例如:
class JsonService<R> extends BaseService<String, R> - 父接口
BaseService<I, O>有两个参数,这里把I固定为String(输入总是 JSON 字符串),只让R可变(输出任意类型) - 既约束了协议边界,又保留了关键灵活性,常见于 RPC 客户端、序列化封装等场景

















