泛型通过编译期类型检查避免运行时异常,定义如Container,T为类型参数;可用上界限定范围;泛型方法如 T get(Class clazz)提升灵活性;因类型擦除,不可new T()或instanceof T,需用工厂方法或Class校验。

直接用泛型定义容器类,让编译器在编译期检查类型匹配,就能避免运行时类型转换异常。核心不是靠运行时判断,而是靠声明时的类型约束和编译器的静态验证。
定义泛型类,绑定类型参数
把类型作为参数写在类名后面,比如 Container
- 字段声明:private T value;
- 设值方法:public void setValue(T value) —— 传入非 T 类型会编译报错
- 取值方法:public T getValue() —— 返回值无需强转,IDE 能准确提示类型
用有界类型参数限制合法范围
如果容器只接受某类及其子类(比如只存 Animal 及其子类 Lion、Tiger),可以用 extends 设定上界:
- class ZooCage
- 这样 zoo.add(new Car()) 就通不过编译,而 zoo.add(new Lion()) 合法
- 还能在方法里安全调用 Animal 定义的方法,比如 animal.speak()
泛型方法补充灵活性
有些操作不需要整个类都泛型化,比如一个工具类里的通用获取方法。可以单独声明泛型方法:
-
T get(Class —— 调用时传 Lion.class,返回值自动推导为 Lion 类型clazz) - 配合 clazz.isInstance(obj) 做运行时校验,再做强制转换,既安全又保留 IDE 补全
- 避免了 (Lion) zoo.get("lion") 这种裸转,出错提前到编译期
注意擦除带来的限制
Java 泛型在运行时会擦除类型信息,所以不能直接 new T() 或用 instanceof 判断 T。但这些限制不影响类型安全目标:
- 不能写 new T()?改用工厂方法或传入 Class 对象
- 不能 if (obj instanceof T)?改用 clazz.isInstance(obj)
- 数组不支持泛型?用 List
替代,更安全也更常用










