Java泛型类继承时子类必须显式指定父类类型实参或声明并传递自身类型参数:StringBox extends Box<String>正确,BadBox extends Box<T>错误;FancyBox<T> extends Box<T>可透传,NumberBox<T extends Number>可增强约束;禁止原始类型继承、静态成员依赖泛型、覆盖泛型方法改类型。

Java 泛型类继承时,子类必须显式处理父类的类型参数——不能跳过、不能隐式沿用,也不能写未声明的形参。核心就一条:编译器要求每个泛型父类在 extends 中都得有明确的类型实参,或由子类自己声明并传递。
子类固定父类泛型为具体类型
适合封装确定用途的子类,类型安全、语义清晰,运行时也无歧义。
- 父类定义:
class Box<T> { T value; } - 正确写法:
class StringBox extends Box<String> { }✅ - 错误写法:
class BadBox extends Box<T> { }❌(T未定义,编译不通过) - 注意:此时
StringBox不再是泛型类,所有方法签名中的T都被替换为String,比如get()返回String而非Object。
子类保留泛型并透传类型参数
保持通用性,让子类实例化时决定实际类型,同时复用父类逻辑。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 正确写法:
class FancyBox<T> extends Box<T> { }✅ - 也可引入新参数:
class PairBox<K, V> extends Box<K> { }✅(只把K传给父类) - 关键点:子类声明的
<T>是独立声明的类型形参,不是“继承”来的;它只是恰好与父类同名,并在extends中作为实参提供。
子类增强约束,收紧类型范围
在透传基础上加 extends 边界,让子类能安全调用更多方法,同时限制可接受的类型。
立即学习“Java免费学习笔记(深入)”;
- 例如:
class NumberBox<T extends Number> extends Box<T> { } - 这样子类中就能放心调用
get().doubleValue(),因为编译器知道T一定是Number或其子类。 - 支持多重边界:
<T extends Comparable<T> & Cloneable>,但注意接口必须列在类之后。
必须避开的典型错误
这些写法看似省事,实则破坏类型安全或直接编译失败。
-
原始类型继承:
class RawBox extends Box { }—— 擦除全部泛型信息,value变成Object,无法保证类型一致性。 -
静态成员依赖泛型类型:父类中
static List<T> cache;是非法的,静态字段/方法不感知泛型参数,JVM 中只有一个cache,类型擦除后就是List。 -
试图覆盖泛型方法并改类型:父类有
<U> U get(),子类不能写<V> V get()来“重写”,这不算覆盖,而是重载,容易引发调用歧义。

















