Java泛型支持类和接口中声明多个类型参数,用逗号分隔并置于尖括号内,各参数独立使用且可带边界约束;实例化需显式指定具体类型;实现或继承时须保证类型参数数量与约束兼容;命名应具语义,注意类型擦除限制及基本类型不可用。

Java 泛型支持在类和接口定义中声明多个类型参数,用逗号分隔,写在尖括号内(
泛型类的多类型参数定义
多个类型参数让类能同时抽象多种角色或结构关系,比如“键-值”、“源-目标”、“输入-输出-异常”等场景。
- 语法格式为:class ClassName<T, U, V> { ... }
- T、U、V 是独立的类型形参,可在类体内任意使用,彼此无隐含关联
- 实例化时必须显式传入具体类型,如 Pair<String, Integer> 或 Transformer<User, Order, ValidationException>
- 类型参数可带边界约束,例如 <K extends Comparable<K>, V> 表示 K 必须可比较,V 无限制
泛型接口的多类型参数定义
接口同样支持多个类型参数,常用于定义通用契约,如数据转换、映射、校验、事件处理等。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 定义示例:interface Mapper<S, T> { T map(S source); }
- 双参数常见于转换类接口;三参数可用于带上下文或错误类型的契约,如 interface Processor<In, Out, Context>
- 接口可同时约束多个参数,例如 interface Pair<T extends Number, U extends CharSequence>
- 函数式接口也能组合多泛型,如 @FunctionalInterface interface BiConsumer<T, U> { void accept(T t, U u); }
实现与继承中的类型传递规则
当泛型类实现泛型接口,或泛型类继承另一个泛型类时,需确保类型参数数量和约束兼容。
立即学习“Java免费学习笔记(深入)”;
- 实现接口时,若指定具体类型,如 class UserMapper implements Mapper<JsonNode, User>,则所有方法签名按实参展开
- 若保持泛型延续,如 class GenericMapper<S, T> implements Mapper<S, T>,则子类仍具备泛化能力
- 继承泛型父类时,子类必须提供父类所需数量的类型参数,不能省略或错位,例如 class SafeList<E> extends ArrayList<E> 合法,而 class Bad extends ArrayList<String> 会丢失泛型灵活性
注意事项与常见误区
多类型参数虽灵活,但需注意编译期语义清晰性与运行时擦除限制。
- 类型参数名应具语义,避免全用 T/U/V;推荐如 <Key, Value>、<Source, Target> 等
- 不能用基本类型作为类型实参,只能用包装类(Integer 而非 int)
- 运行时无法获取泛型实际类型(类型擦除),所以不能写 if (obj instanceof T) 或 new T()
- 多个参数间无自动推导关系,<T extends Number, U extends T> 是非法的——Java 不支持类型参数间的继承约束(U 不能直接 extends T)

















