子类继承泛型父类时必须明确类型参数:非泛型子类需传具体类型(如StringBox extends Box<String>),泛型子类可透传或新增参数(如EnhancedBox<T> extends Box<T>),并支持上界约束(如NumberBox<T extends Number> extends Box<T>),但受类型擦除限制,运行时无泛型信息。

泛型类作为父类时,子类必须明确处理其类型参数——不能照搬泛型形参,而要提供具体类型或重新声明并传递。这是编译期强制要求,核心在于类型安全与擦除机制的协同约束。
子类必须为父类泛型参数提供实参
当父类定义为 class Box<T>,子类若非泛型,则必须在 extends 中填入具体类型:
-
class StringBox extends Box<String>✅ 正确:用String替换T -
class BadBox extends Box<T>❌ 编译错误:T未定义,父类部分不能保留形参
子类可自身泛型化并透传类型参数
若子类需保持通用性,应声明自己的类型参数,并将其传递给父类:
-
class EnhancedBox<T> extends Box<T>✅ 类型参数由子类实例化时确定,如new EnhancedBox<Integer>() -
class PairBox<K, V> extends Box<K>✅ 引入新参数V,只将K传给父类
可添加上界约束以增强类型安全性
继承时不仅能传递类型,还能收紧范围,确保子类可用父类中未暴露的操作:
-
class NumberBox<T extends Number> extends Box<T>—— 子类方法中可安全调用get().doubleValue() -
class SortedList<T extends Comparable<T>&Cloneable> extends ArrayList<T>—— 支持排序与克隆逻辑
注意类型擦除带来的行为边界
无论怎么继承,运行时所有泛型信息均被擦除。这意味着:
-
StringBox和IntegerBox在 JVM 中都只是Box的子类,无父子类型关系 -
Box<String>不能赋值给Box<Object>,Java 泛型不支持协变(除非用通配符Box<? extends Object>) - 子类无法在运行时获取父类实际类型参数,反射拿到的仍是
Object

















