Java中定义多个泛型类型参数需在类或接口名后用逗号分隔,如<K,V>;各参数独立、命名应规范(如K/V、T/E),可分别设上界(extends),实例化时须按序填满具体类型,继承或实现时参数数量与约束须严格一致。

Java 中定义多个泛型类型参数,就是在类名后的一对尖括号里用逗号分隔多个类型变量,比如 <K, V> 或 <T, U, E>。每个参数独立存在、各自承担语义角色,不是顺序依赖,但命名要清晰、符合惯例。
语法结构和基本写法
声明格式很简单:在 class 或 interface 后紧跟 <T1, T2, ..., Tn>。例如:
class Pair<K, V> { private K key; private V value; }interface Transformer<In, Out, Err> { Out transform(In input) throws Err; }class Triple<A, B, C> { A first; B second; C third; }
注意:类型参数名只是占位符,不参与运行时;推荐使用 K/V(键/值)、T/U(类型/辅助类型)、E(元素)、R(返回值)等标准缩写,避免 <key, value> 这类非规范写法。
给类型参数加约束(上界)
多个参数可以分别或组合设置上界,用 extends 限定其必须满足的条件:
立即学习“Java免费学习笔记(深入)”;
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
-
<K extends Comparable<K>, V extends Serializable>:K 必须可比较,V 必须可序列化 -
<T extends Runnable & Cloneable, U extends Number>:T 要同时实现两个接口,U 必须是数字子类
多个上界用 & 连接,且类只能有一个(必须放在最前),接口可多个。不能用 super 修饰类声明中的类型参数。
实例化时必须填满所有类型
创建对象时,尖括号内要按顺序传入具体类型,数量、顺序、兼容性都必须匹配:
Pair<String, Integer> p = new Pair<>();Transformer<User, Order, ValidationException> t = new JsonToOrderTransformer();- 如果漏掉一个,比如写成
Pair<String>,编译直接报错
类型擦除后,运行时看不到泛型信息,所以所有类型参数都必须在编译期确定。
继承或实现时保持参数一致
当子类继承泛型父类,或类实现泛型接口,类型参数数量和约束要对齐:
- 正确:
class StringToIntMapper implements Mapper<String, Integer> - 也正确:
class GenericMapper<S, T> implements Mapper<S, T>(延续泛型) - 错误:
class BadMapper implements Mapper<String>(少一个参数) - 错误:
class Wrong<T> extends Pair<T, T>却想只传一个类型——不行,Pair要两个
参数之间没有隐含关系,K 和 V 完全独立,哪怕都写成 T,也是两个不同的类型变量。

















