Java泛型中用<T extends A & B & C>约束类型参数必须同时实现多个接口,语法要求仅一个类上界且居首、接口用&连接、不可混入第二个类。

Java 泛型中限制类型参数必须同时实现多个接口,用 & 连接多个接口名,写在 extends 后面,格式为:<T extends InterfaceA & InterfaceB & InterfaceC>。这不是“或”的关系,而是“且”——传入的实际类型必须全部实现这些接口,缺一不可。
语法要点和常见写法
这种多重接口约束的核心规则很明确:
- 开头必须是
extends,哪怕后面全是接口,也不能用implements - 多个接口之间用
&连接,不能用逗号(,)或and等关键字 - 接口顺序无关紧要,
<T extends Cloneable & Serializable>和<T extends Serializable & Cloneable>效果完全一样 - 可以不带类上界,纯接口组合是最常见的用法
泛型类和泛型方法中怎么写
无论用在类还是方法上,语法一致,区别只在作用范围:
- 泛型类示例:
class LogProcessor<T extends Auditable & Serializable> { ... }—— 类体内所有T都受此约束 - 泛型方法示例:
<T extends Validatable & JsonSerializable> String toJson(T obj) { ... }—— 仅该方法的参数、返回值和局部变量中的T受限
为什么不能用通配符(?)做多重约束
通配符不支持 & 语法。下面这种写法是非法的:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
List<? extends Runnable & Serializable> ❌ 编译报错
通配符只允许单个上界,比如 ? extends Serializable 或 ? super Runnable。如果需要多能力校验,必须用具名类型参数(即 <T extends ...>),不能依赖 ?。
实际业务中怎么选接口组合
选哪些接口,取决于你要在泛型代码里安全调用哪些方法。例如:
- 要序列化 + 日志记录 + 校验:用
<T extends Serializable & Loggable & Validatable> - 要排序 + 网络传输:用
<T extends Comparable<T> & Serializable> - 要响应前端 + 审计追踪:用
<T extends ApiResponse & Auditable>
只要你在方法体里调用了 obj.toJson()、obj.getAuditInfo() 这类方法,编译器就会确保 T 真的实现了对应接口。

















