java中定义多个类型参数需在尖括号内用逗号分隔,置于类名、接口名或方法返回类型前;支持语义化命名、独立约束、字段/构造器一一对应,以及类型间extends关联。

Java 中定义多个类型参数,关键是在尖括号里用逗号分隔多个类型变量,并放在类名、接口名或方法返回类型之前。这不是简单叠加,而是让每个类型承担清晰角色,比如键与值、输入与输出、ID 与数据。
泛型类中声明多个类型参数
语法写在类名后,紧贴类名,用 <k v></k> 或 <input output> 这类形式:
- 必须用逗号分隔,不能省略空格(但空格不影响编译)
- 命名建议语义化:K/V 表示键值对,T/R 或 Input/Output 表示转换关系
- 每个类型参数可独立加约束,例如
<k extends charsequence v number></k> - 字段和构造函数需一一对应:声明了
<id data status></id>,就该有三个不同类型的私有字段
泛型方法中使用多个类型参数
方法级别的多类型参数要写在返回类型前、修饰符后,格式为 <t u> ReturnType methodName(...)</t>:
- 例如:
public <k v> Map<k v> createMap()</k></k> - 调用时编译器通常能自动推断,如
process("name", 42)→ K 推为String,V 推为Integer - 若参数含
null或类型模糊,需显式指定,如Utils.<string boolean>parse(input)</string> - 静态方法尤其要注意:没有实例上下文,无法依赖类的类型参数,所有类型都得靠方法自己声明
接口与实现类中的多类型参数
泛型接口同样支持多个类型参数,实现类在 implements 时需填入具体类型:
- 接口定义:
interface Processor<in out err> { Out handle(In input) throws Err; }</in> - 实现类:
class JsonProcessor implements Processor<string order ioexception></string> - 接口方法体内部可自由使用这三个类型,互不干扰
- 实现类不强制泛型化;也可写成
class JsonProcessor<t> implements Processor<t order exception></t></t>,叠加使用
类型参数之间的约束与解耦
多个类型参数默认相互独立,但可通过 extends 建立关联:
- 想让第二个类型是第一个的子类?写成
<t u extends t></t> - 要求同时实现多个接口?用
&连接:<t extends runnable serializable></t> - 类的类型参数和其内部泛型方法的类型参数完全无关——除非你手动用
extends T绑定 - 避免滥用通配符替代多参数: extends A, ? super B> 不合法,通配符只适用于单个位置(如参数类型),不能用于类或方法声明
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











