子类继承泛型父类时必须明确类型参数:非泛型子类需传具体类型(如stringbox extends box),泛型子类可透传或新增参数(如enhancedbox extends box),并支持上界约束(如numberbox extends box),但受类型擦除限制,运行时无泛型信息。

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










