Java接口泛型将类型检查前移至编译期,通过接口声明(如interface Repository<T>)、方法签名约束(如T findById(Long id))、继承扩展(如interface UserRepository extends Repository<User>)及边界限定(如<T extends Comparable<T>>)构建强类型契约。

Java 接口中使用泛型参数,本质是把类型检查前移到编译期,让实现类或调用方明确承诺“处理哪种具体类型”,从而在不牺牲灵活性的前提下建立强类型契约。
在接口声明处定义泛型参数
直接在 interface 关键字后添加类型参数列表,语法与类泛型一致。该参数可被用于方法签名、返回值、参数甚至默认方法中:
- 接口名后紧跟
<T>、<K, V>等形式,如interface Repository<T> - 泛型参数作用于整个接口,所有抽象方法和默认方法均可引用它
- 不能在静态方法中使用接口的类型参数(因静态成员属于类型本身,不随实例化变化)
用泛型约束方法输入输出,形成类型闭环
把泛型参数嵌入方法签名,强制实现类保持“入参和返回值类型一致”或“满足特定关系”,避免运行时转型风险:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
T findById(Long id);→ 要求实现类必须返回确切的T类型对象,而非 Object -
void save(T entity);→ 编译器会检查传入对象是否为T或其子类 -
<R> R convert(T source, Class<R> targetType);→ 支持方法级泛型,进一步细化转换契约
通过继承/扩展复用泛型契约
子接口可固定父接口的泛型参数,也可引入新参数,实现契约的精细化分层:
立即学习“Java免费学习笔记(深入)”;
-
interface UserRepository extends Repository<User> { }→ 固定为 User,所有方法自动适配 -
interface KeyedRepository<K, V> extends Repository<V> { V findByKey(K key); }→ 扩展双参数契约,同时保留原泛型语义 - 实现类需完整指定所有泛型参数:
class JdbcUserRepository implements UserRepository(等价于implements Repository<User>)
配合泛型边界(bounded type parameters)增强约束力
用 extends 限定泛型参数必须是某类或实现某接口,让接口能安全调用通用行为:
-
interface ComparableRepository<T extends Comparable<T>> { T findMax(); }→ 编译器允许在内部调用t1.compareTo(t2) -
<T extends Serializable & Cloneable> void persist(T obj);→ 多重边界,要求同时满足 - 边界不是运行时检查,而是编译期推导依据;擦除后仍保留上界信息供反射使用

















