java自定义泛型应以类型安全与意图明确为核心,通过extends合理设上界(如number、comparable、animal)、避免非法super下界,命名用t/e/k/v/x等语义化单字母,按最小必要原则约束边界。

Java 自定义泛型时,规范参数类型约束的核心是让类型安全、意图明确、不增加调用方负担——不是堆语法,而是靠合理设界、选名和匹配实际用途。
用 extends 明确上界,限定可接受范围
当泛型逻辑依赖某些行为(比如比较、序列化、转换),必须通过上界约束类型能力:
- 只处理数字:声明
<t extends number></t>,这样就能在方法内安全调用doubleValue()或intValue() - 要求可比较:写成
<t extends comparable>></t>,确保能用compareTo()排序或找最小值 - 限定为某类及其子类:如
<t extends animal></t>,适用于统一处理猫、狗等实例的仓库类 - 支持多个接口:用
<t extends serializable cloneable></t>,表示既要能序列化又要可克隆
慎用下界 super,多数场景不必要
super 主要用于通配符(如 Collection super String>),自定义泛型类或方法中直接使用 <t super x></t> 是非法的。Java 不允许对类型参数本身设下界。
若真需逆变语义(例如往容器里“写入”数据),应优先考虑在使用处用通配符,而不是把 super 塞进泛型声明里。
命名规范:单字母 + 语义暗示
类型参数名不是随意起的,它承担着文档作用:
- 通用元素:用
T(Type)或E(Element),如List<e></e> - 键值对:用
K和V,如Map<k v></k> - 异常类型:用
X(Exception),如<x extends exception></x> - 避免无意义泛化:不要为只存
User的类定义<t extends object></t>,这等于没约束
避免过度约束,按最小必要原则设界
类型边界越宽,复用性越高;但太宽又失去校验意义。关键看方法体里真正用了什么能力:
- 如果只是打印对象,
<t></t>就够了(默认隐含extends Object) - 如果要调用
toString(),也不必加界——所有引用类型都有 - 如果需要反射创建实例,就得额外传
Class<t></t>,因为类型擦除后无法获取T.class - 不要为了“看起来高级”而硬加
<t extends charsequence></t>,除非你真要调用subSequence()
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











