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

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


















