Java接口泛型通过类型参数抽象数据结构并契约化操作逻辑,支持单/双类型泛化、边界约束,实现类需显式传递类型参数,函数式接口可提升复用性,但受类型擦除限制不可用instanceof T或new T()。

Java 中接口配合泛型实现通用泛化行为,关键在于用类型参数抽象数据结构,再通过方法签名把操作逻辑契约化——不是写死具体类型,而是让调用方在使用时决定类型,同时保证编译期类型安全。
定义带类型参数的接口
接口声明时加上 <t></t> 或多个类型参数(如 <t r></t>),所有方法都基于这些参数设计。比如:
-
单类型泛化:定义数据容器行为,
interface Repository<t> { void save(T item); T findById(Long id); }</t> -
双类型泛化:描述转换或交互关系,
interface Mapper<s t> { T map(S source); }</s> -
带边界约束:限制可用类型范围,
interface ComparableContainer<t extends comparable>> { T getMax(); }</t>
实现类必须显式传递类型参数
实现类不能忽略接口的泛型声明,否则会丢失类型信息,导致方法签名不匹配或退化为 Object。正确写法是:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 指定具体类型:
class UserRepo implements Repository<user> { ... }</user> - 保持泛型延续:
class GenericDao<t> implements Repository<t> { ... }</t></t>(适用于工具类) - 避免错误写法:
class BadRepo implements Repository(编译警告,实际等价于Repository<object></object>)
配合函数式接口提升行为复用性
当接口只含一个抽象方法,且聚焦“做什么”而非“怎么做”,就适合定义为函数式接口,再与泛型组合:
立即学习“Java免费学习笔记(深入)”;
- 定义:
@FunctionalInterface interface Validator<t> { boolean valid(T t); }</t> - 通用校验方法:
<t> boolean validateAll(List<t> items, Validator<t> v) { return items.stream().allMatch(v::valid); }</t></t></t> - 调用时自动推断:
validateAll(users, u -> u.getEmail() != null)
注意类型擦除下的可用性边界
泛型只在编译期存在,运行时不可知具体类型。因此:
- 不能在实现中用
instanceof T或new T() - 若需运行时类型信息(如 ORM 映射),要配合
Class<t></t>参数传入:public <t> List<t> query(Class<t> type)</t></t></t> - 避免在泛型接口中依赖静态泛型方法——静态方法无法访问实例泛型参数

















