子类必须显式处理父类泛型参数:固定具体类型(如stringbox extends box)、透传自身类型参数(如enhancedbox extends box)或添加上界约束(如numberbox extends box),禁止原始类型继承。

Java 泛型类继承时,子类必须显式处理父类的类型参数——不能跳过、不能隐式继承,也不能用未声明的形参占位。核心就一条:编译器要能静态确认每个泛型位置上的类型实参或约束是否合法。
子类固定父类泛型为具体类型
适用于封装确定用途的子类,比如专门存字符串或数字的容器。
- 写法:直接在 extends 后填入具体类型,如
class StringBox extends Box<string></string> - 注意:
class BadBox extends Box<t></t>是非法的——T 在子类作用域未定义,编译报错 - 好处:类型安全直达实例层,
get()返回 String,无需强转;IDE 和编译器可校验所有操作
子类保留并透传父类泛型参数
让子类继续具备泛化能力,适合构建通用增强组件。
- 写法:子类自身声明相同名称的类型参数,并传递给父类,如
class EnhancedBox<t> extends Box<t></t></t> - 允许扩展:可以只传部分参数,比如父类是
Pair<k v></k>,子类class KeyOnlyBox<k> extends Pair<k object></k></k> - 关键点:子类实例化时(如
new EnhancedBox<integer>()</integer>),类型参数才被实际绑定,父类逻辑随之生效
子类添加上界约束再继承
在复用父类能力的同时,收紧类型范围,解锁更多操作权限。
- 写法:用 extends 对类型参数加约束,如
class NumberBox<t extends number> extends Box<t></t></t> - 效果:子类中可安全调用
get().doubleValue()或get().intValue(),因为 T 保证是 Number 子类 - 支持多约束:
<t extends comparable> & Cloneable></t>表示同时满足可比较和可克隆
避免原始类型继承和运行时陷阱
看似省事的写法,往往埋下类型安全隐患。
- 禁止:
class RawChild extends Box—— 这是原始类型继承,泛型完全丢失,get()变成返回 Object - 运行时无泛型信息:无论怎么继承,JVM 中
Box<string></string>和Box<integer></integer>都是同一个 Box.class,无法通过instanceof或getClass()区分 - 静态成员不参与泛型:父类中的
static List<t></t>实际是static List,类型擦除后只剩原始类型
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











