泛型边界用于限制类型参数取值范围以提升安全性和表达力;上界用extends/bound限定子类型,支持协变读取;下界用super/Union支持逆变写入;多约束用constraints或多重extends限定具体类型。

泛型边界用于限制类型参数的取值范围,让泛型更安全、更有表达力。设定边界不是可选项,而是当你需要约束“能传什么类型进来”时的必要操作。
上界边界:只接受某类或其子类
上界边界确保泛型参数是某个类型的子类型(包括自身)。Java 用 extends 关键字,Python 用 bound 参数。
- Java 示例:
List extends Number>可接收Integer、Double,但不能加元素(只读安全);<t extends comparable>></t>表示 T 必须可比较,常用于排序方法 - Python 示例:
T = TypeVar('T', bound=str)表示 T 只能是str或其子类(虽然 str 通常不被继承,但 bound 仍起约束作用);若写bound=Callable,则只接受可调用对象 - 关键点:上界用于增强读取安全性,也支持协变——比如
ArrayList<dog></dog>可赋给List extends Animal>
下界边界:只接受某类或其父类
下界边界放宽了输入限制,允许更宽泛的类型参与写入操作,常见于数据消费场景。
- Java 中用 super:
Collection super Integer>可接收Collection<number></number>或Collection<object></object>,你可以往里 addInteger,但取出来只能当Object - Python 没有直接等价的
super语法,但可通过 Union 或自定义协议间接实现类似意图,例如:T = TypeVar('T', bound=Union[int, float])(注意:实际应使用constraints更准确) - 典型用途:向集合中添加元素时,希望兼容更通用的容器类型,即“逆变”行为
多类型约束:限定为几个明确候选
当类型不能简单用继承关系描述,而必须是几个具体类型之一时,用多约束更精准。
- Python 使用 constraints:
T = TypeVar('T', constraints=(int, float, complex)),此时T只能是这三个类型之一,str会被 mypy 报错 - Java 没有原生多上界通配符,但泛型类/方法声明支持多重上界:
<t extends serializable cloneable></t>,表示 T 必须同时实现两个接口 - 注意:constraints 和 bound 互斥,不能同时指定;且 constraints 不支持子类自动匹配,必须严格等于列出的类型
边界使用的常见误区
边界设得不对,轻则失去类型提示意义,重则引发编译失败或运行时隐患。
- 把
? extends Object当万能解——它等价于无界通配符?,没实际约束力 - 在需要写入的上下文中误用上界通配符,导致
add()方法不可调用 - Python 中对
bound理解为“必须是该类实例”,其实 bound 是类型检查层面的静态约束,运行时不生效 - 忽略类型擦除:无论边界多严格,运行时都不存在,边界只服务编译期检查和 IDE 提示


















