Java自定义泛型应以类型安全与意图明确为核心,通过extends合理设上界(如Number、Comparable、Animal)、避免非法super下界,命名用T/E/K/V/X等语义化单字母,按最小必要原则约束边界。

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


















