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。正确写法是:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 指定具体类型:
class UserRepo implements Repository<user> { ... }</user> - 保持泛型延续:
class GenericDao<t> implements Repository<t> { ... }</t></t>(适用于工具类) - 避免错误写法:
class BadRepo implements Repository(编译警告,实际等价于Repository<object></object>)
配合函数式接口提升行为复用性
当接口只含一个抽象方法,且聚焦“做什么”而非“怎么做”,就适合定义为函数式接口,再与泛型组合:
- 定义:
@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> - 避免在泛型接口中依赖静态泛型方法——静态方法无法访问实例泛型参数
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










