Java泛型多边界限定必须用&连接且类在前接口在后,如<T extends A & B & C>;逗号仅用于分隔多个类型参数(如<K,V>),不能用于同一参数的多边界,否则编译报错。

Java 中泛型的多个边界限定,用 & 连接,**不能用逗号**,且 有严格顺序要求:类必须写在最前面,接口可以跟在后面,任意多个(用 & 分隔)。
语法格式
正确写法:
<T extends A & B & C>
其中:
-
A必须是类(或java.lang.Object,但通常省略),且只能有一个; -
B、C等必须是接口,数量不限; -
extends关键字只写一次,开头统一声明所有边界; - 顺序不能颠倒 —— 类必须在前,接口在后。
为什么不能写成 <T extends A, B>?
这种写法是错误的,因为逗号在泛型中用于分隔多个类型参数(如 <K, V>),不是用于限定同一类型参数的多个边界。编译器会报错:unexpected type 或 interface expected here。
立即学习“Java免费学习笔记(深入)”;
实际例子
假设有一个类 Animal,两个接口 Runnable 和 Swimmable:
class Animal { }
interface Runnable { void run(); }
interface Swimmable { void swim(); }
// ✅ 正确:Animal 是类,放在最前;两个接口用 & 连接
class Cage<T extends Animal & Runnable & Swimmable> {
private T occupant;
void release() {
occupant.run();
occupant.swim();
}
}
使用时,传入的类型必须同时继承 Animal 并实现那两个接口:
class Duck extends Animal implements Runnable, Swimmable { ... }
Cage<Duck> cage = new Cage<>(); // ✅ 合法
注意事项
- 如果只限定接口,可以省略类(此时默认隐含
Object),例如<T extends Serializable & Comparable<T>>; - 不能重复限定同一个接口(编译报错);
- 类型擦除后,JVM 只保留第一个边界(即
A)作为运行时类型信息,其余接口边界仅用于编译期检查。


















