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

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










