泛型父类通过类型参数T抽象变化点,子类继承时需明确处理:保持泛型透传、固定为具体类型或引入新泛型;可加extends约束提升类型安全;受类型擦除限制,运行时无法区分泛型实参。

泛型父类定义要明确类型参数
通用父类的核心是把变化点抽成类型参数,而不是写死具体类型。比如一个容器类,值的类型不确定,就用 T 占位:
// 泛型父类,T 是待定类型
public class Container
private T data;
public void set(T data) { this.data = data; }
public T get() { return data; }
}
子类继承时有三种常见策略
子类不能“跳过”父类的泛型要求,必须给出明确处理方式:
-
策略一:子类保持泛型,透传类型参数
适用于需要延续通用性的场景,如增强版容器:
public class EnhancedContainerextends Container {
public void logAccess() { System.out.println("Accessed: " + get()); }
} -
策略二:子类固定父类类型,变成具体类
适合业务中只用某一种类型的场景,如专门存字符串:
public class StringContainer extends Container{
public boolean isEmpty() { return get() == null || get().trim().length() == 0; }
} -
策略三:子类引入新泛型,并约束或传递给父类
用于扩展能力,比如带键值对的容器:
public class KeyValueContainerextends Container {
private K key;
public void setKey(K key) { this.key = key; }
}
可叠加类型边界提升安全性
如果父类逻辑依赖某些方法(比如数字运算、比较),就在继承时加 extends 约束,让编译器帮你检查:
public class NumberContainer
public double toDouble() { return get().doubleValue(); }
public T add(T other) { return (T) Double.valueOf(get().doubleValue() + other.doubleValue()); }
}
这样 NumberContainer<string></string> 就直接编译失败,避免运行时出错。
立即学习“Java免费学习笔记(深入)”;
注意擦除带来的限制
Java 泛型在运行时被擦除,所以:
- 不能用
instanceof Container<string></string>判断具体泛型类型 -
Container<string></string>和Container<integer></integer>在 JVM 中都是Container,没有继承关系 - 子类无法通过反射获取父类实际传入的类型实参(如
String),只能拿到原始类型Container


















