Java泛型继承中泛型是否保留取决于子类声明方式:显式声明类型参数则保留,指定具体类型则固定,省略类型参数则退化为Object,添加类型边界可增强编译期约束。

Java 泛型继承中,是否保留或擦除泛型定义,取决于子类如何声明和使用父类的类型参数——这不是由你“选择擦除”,而是由编译器根据语法结构自动决定的。关键在于:**子类是否显式声明并传递类型参数**。
保留泛型:子类继续带类型参数
当子类自身也定义泛型,并将类型参数原样传给父类时,泛型信息在编译期全程保留,类型检查严格,运行时虽仍擦除,但继承关系和方法签名保持完整。
- 写法示例:
class MyBox<t> extends Box<t></t></t> - 子类方法重写时,参数/返回值类型仍为
T(不是Object) - 父类泛型字段(如
private T value)在子类中仍按T处理 - 适用于通用工具类、框架组件等需要复用多种类型的场景
固定类型:子类指定具体类型参数
子类不声明泛型,而是直接继承 Box<string></string> 这类具象化形式。此时父类泛型被“实例化”,子类变为具体类型,不再具备泛型能力。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 写法示例:
class StringBox extends Box<string></string> - 编译后,所有
T被替换为String,方法签名变成void set(String)和String get() - 子类无法再适配其他类型,但接口更清晰、调用更安全
- 适合业务模型明确、用途单一的封装,比如
UserRepository继承JpaRepository<user long></user>
意外擦除:未声明类型参数且未指定具体类型
这是最易踩坑的情况:子类写成 class BadBox extends Box(省略尖括号)。Java 将其视为“原始类型继承”,父类所有泛型全部退化为 Object。
立即学习“Java免费学习笔记(深入)”;
- 方法签名变成
void set(Object)、Object get() - 子类中访问
value字段时,类型是Object,需手动强转 - 丢失编译期类型检查,等同于没用泛型
- IDE 通常会警告 “Raw use of parameterized class 'Box'”
扩展约束:在继承时添加类型边界
子类可在继承同时收紧泛型范围,例如要求 T 必须实现 Comparable。这既保留泛型,又增强语义约束。
- 写法示例:
class SortedBox<t extends comparable>> extends Box<t></t></t> - 编译器允许调用
t.compareTo(...),但禁止传入new Object() - 边界信息参与编译检查,但运行时仍擦除为
Object - 常见于集合工具类、算法容器等对类型有行为要求的场景

















