泛型接口类型参数必须在实现或继承时明确:非泛型类实现需指定具体类型,泛型类实现须透传类型参数,子接口继承须立即固化父接口类型参数,静态成员不可引用类型参数。

Java 泛型中,接口与类在定义和实现时对类型参数的处理有明确规则。关键在于:类型参数必须在使用处(而非定义处)被具体化或透传,且继承/实现关系需严格匹配参数数量、顺序与约束边界。
泛型接口定义时的类型参数规范
接口声明泛型参数直接写在接口名后,如 interface Repository<t></t> 或 interface Pair<k v></k>。这些参数作用于整个接口,可用于所有抽象方法、默认方法的返回值、参数甚至局部变量声明中。
- 静态方法不能引用接口自身的泛型参数,因为静态成员属于类型层级,不随实例类型变化
- 可添加上界约束,如
<t extends comparable>&Serializable></t>,让编译器允许调用compareTo()和序列化操作 - 接口支持多参数组合,常见于转换、映射、上下文处理等场景,例如
interface Processor<in out context></in>
泛型类实现泛型接口的两种方式
实现类决定接口泛型如何落地,分两类情形:
- 非泛型实现类必须指定具体类型,如
class JdbcUserRepository implements Repository<user></user>,此时所有T全部替换为User,方法签名被完全展开 - 泛型实现类需透传参数,如
class GenericMapper<s t> implements Mapper<s t></s></s>,保持契约开放性,调用方在构造时才确定实际类型 - 不允许混用名称,如
class Container<u> implements Mapper<t></t></u>编译失败,因T未声明
泛型类继承泛型父类的类型传递规则
子类继承时,必须显式处理父类所需的类型参数:
- 保留泛型:如
class SafeList<e> extends ArrayList<e></e></e>,类型参数一致传递,灵活性完整保留 - 固定类型:如
class StringBox extends Box<string></string>,限制用途但增强语义明确性 - 扩展新参数:如
class PairBox<t u> extends Box<t></t></t>,在继承基础上引入额外维度,不干扰父类契约 - 不可省略或错位:父类要求两个参数,子类就必须提供两个,且顺序、约束需兼容
接口继承中的泛型固化原则
子接口扩展泛型父接口时,不能继续泛化父接口的类型参数,而必须当场确定:
- 合法:
interface UserRepository extends Repository<user></user>—— 父接口Repository<t></t>的T被固化为User - 合法:
interface KeyedRepository<k v> extends Repository<v></v></k>—— 引入新参数K,同时将V作为父接口实参 - 非法:
interface GenericRepo<t> extends Repository<t></t></t>—— 这不是继承,而是重定义,JVM 视为独立接口
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











