泛型类继承要求子类明确处理父类类型参数:非泛型子类须填入具体类型,泛型子类可透传、重命名或加约束,类型边界可增强不可放宽,且运行时因类型擦除导致泛型不协变。

泛型类继承关系的关键在于:子类必须明确处理父类的类型参数——不能跳过、不能照搬形参,而要具体化、透传或加约束。这是编译器强制要求,根源是类型擦除机制与类型安全协同的结果。
非泛型子类:必须填入具体类型
当子类本身不带类型参数时,必须在 extends 后给出父类泛型的实际类型,否则编译失败。
-
✅ 正确写法:`class StringBox extends Box
` —— `String` 替换父类的 `T`,类型固化,方法签名中 `set()` 接收 `String`,`get()` 返回 `String` -
❌ 错误写法:`class BadBox extends Box
` —— `T` 未定义,子类作用域里没有声明 `T`,编译报错 “cannot resolve symbol T”
泛型子类:可透传、重命名或加边界
若子类需保持通用性,应自行声明类型参数,并决定如何传递给父类。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
-
透传原参数:`class EnhancedBox
extends Box ` —— 类型一致性最强,`EnhancedBox ` 等价于 `Box ` 的扩展 -
引入新参数:`class PairBox
extends Box ` —— 只将 `K` 传给父类,`V` 用于子类自有逻辑(如缓存键值对) -
收紧上界:`class NumberBox
extends Box ` —— 子类内可安全调用 `get().doubleValue()`,因为编译器知道 `T` 至少是 `Number`
类型约束会逐层累积
父类已有的边界(如 `T extends Comparable
- 父类:`class SortedList
> extends ArrayList ` - 子类:`class TimestampedList
& Cloneable> extends SortedList ` ✅ 允许,增加 `Cloneable` 约束 - 子类:`class RawList
extends SortedList ` ❌ 编译失败,绕过了 `Comparable` 要求
运行时注意类型擦除的影响
无论继承形式如何,JVM 中所有泛型信息都被擦除:
- `StringBox` 和 `IntegerBox` 在运行时都只是 `Box` 的子类,彼此无继承关系
- `Box
` 不能赋值给 `Box - 子类无法通过反射获取父类实际类型参数(如 `String`),拿到的永远是 `Object` 或边界类型(如 `Number`)










