java泛型核心是理解类型擦除机制:所有限制(如不能new t、不能instanceof t、泛型与static冲突等)均源于擦除后运行时无泛型信息;需通过手写通配符场景、泛型工具类及反射陷阱题深化直觉。

练Java泛型面试题,核心不是背答案,而是吃透机制、暴露盲区、建立直觉。重点在理解“为什么这样设计”,而不是“这句话怎么答”。
紧扣类型擦除反推所有限制
把“类型擦除”当作唯一锚点,所有泛型限制都能顺下来:
- 不能 new T() —— 擦除后只剩 Object,编译器不知道该调哪个构造器
- 不能用 instanceof 判断 T —— 运行时 T 已变成 Object 或上界,无泛型信息
- 不能声明 static
方法里的泛型字段 —— static 属于类,而 T 属于实例,二者生命周期不匹配 - 不能 throw new T() —— 异常类型必须在字节码中明确,但 T 在运行时不存在
- List
不能赋值给 List
通配符必须动手写场景对比
光记 ? extends 和 ? super 不够,要写出具体方法并验证行为:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 写一个 只读 方法:void printAll(List extends Number> list) → 可传 List
、List ,但不能 add(1) - 写一个 只写 方法:void fill(List super Integer> list) → 可传 List
、List - 故意写错:List> list = new ArrayList
(); list.add("x"); → 编译失败,理解“无界通配符禁止写入”的原因
手写泛型工具类+边界测试
不抄源码,从零实现一个有真实约束的泛型结构,再暴力测边界:
- 写一个泛型 Pair
,带 equals/hashCode(注意 T 的 null 安全处理) - 写一个泛型 Stack
,用 Object[] + 类型转换模拟底层(理解 (T[])new Object[10] 的必要性) - 故意传入基本类型:Stack
→ 编译报错,确认只能用包装类 - 尝试 Stack> s = new Stack
(); s.push(123); → 看编译器如何拦截
结合反射和异常设计陷阱题
泛型+反射是高频雷区,提前预演典型错误:
- Class
- > c = (Class
- >) List.class; → 表面合法,但运行时 List.class 实际是 raw type,无法还原 String
- 用 Method.getGenericReturnType() 获取 public
T getValue() 方法的 Type → 得到 ParameterizedType,可提取 T 的实际声明(但仅限方法签名,非运行时实例) - 定义 class A
{ void f(T t) {} },子类 class B extends A {},用反射调用 f → 实际接收的是 Object,桥接方法已生成
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










