Java中子类继承泛型父类必须明确处理类型参数:可固定为具体类型(如StringContainer extends Container<String>)、透传自身泛型(如EnhancedContainer<T> extends Container<T>)、或添加上界约束(如NumberContainer<T extends Number> extends Container<T>),但受类型擦除限制,运行时无泛型信息。

Java 中子类继承泛型父类,核心是明确处理父类的类型参数——不能跳过、不能照搬形参,必须给出具体类型或重新声明并传递。这既是编译器强制要求,也是保障类型安全的关键。
子类固定为具体类型
适合业务场景中只操作某一种类型的情况。此时子类不再是泛型类,直接在 extends 后填入实际类型:
- 正确写法:class StringContainer extends Container<String> { ... }
- 父类中的 T 在此处被 String 替换,所有方法签名里的 T 都按 String 处理
- 可添加特有逻辑,比如对 String 做非空校验、trim 操作等
子类保持泛型并透传
当子类仍需通用性,就应声明自己的类型参数,并原样传给父类:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 正确写法:class EnhancedContainer<T> extends Container<T> { ... }
- 实例化时由调用方决定类型,如 new EnhancedContainer<Integer>()
- 可在子类中扩展通用能力,比如增加日志、缓存、校验等不依赖具体类型的逻辑
子类引入新泛型并约束父类类型
用于增强功能维度,比如带键值对、支持排序、限定数字运算等:
立即学习“Java免费学习笔记(深入)”;
- 常见模式:class KeyValueContainer<K, V> extends Container<V> { private K key; ... }
- 也可收紧父类类型范围:class NumberContainer<T extends Number> extends Container<T> { ... }
- 加 extends 约束后,编译器允许调用 get().doubleValue() 这类方法,避免运行时报错
注意类型擦除带来的限制
所有泛型信息在运行时都被擦除,这直接影响继承行为:
- Container<String> 和 Container<Integer> 在 JVM 中都是 Container,没有继承关系
- 无法用 instanceof 判断泛型实参,反射也拿不到子类传给父类的具体类型
- 子类重写方法时,只看擦除后的签名(如 List<T> → List),不能靠泛型不同实现重载

















