泛型与类型擦除与注解与反射

共 66 题
#

1. Class<T>.cast 与普通强制类型转换相比提供什么动态类型保证,Class.asSubclass 又解决什么问题

A cast 是编译期检查
B cast 做运行时类型检查返回实例,asSubclass 做运行时类型层次验证并收窄 Class 类型 ✓ 正确答案
C asSubclass 返回实例
D cast 不做检查
#

2. VarHandle 在原子操作与字段访问的应用

A VarHandle 只能用于 Atomic 类
B VarHandle 提供字段/数组的原子操作与内存访问控制,类型安全、性能好,替代部分 Unsafe 功能 ✓ 正确答案
C VarHandle 只能访问 static 字段
D VarHandle 不如 Atomic 类安全
#

3. 从原始类型 API 迁移到参数化 API 时,怎样缩小 unchecked 警告范围并发现潜在 ClassCastException

A 迁移后仍有 unchecked 警告
B @SuppressWarnings 应放整个类
C 迁移与运行时 CCE 无关
D 逐个处理 unchecked 警告、局部 @SuppressWarnings、用测试覆盖类型,让编译器捕捉类型错误并发现 CCE ✓ 正确答案
#

4. 方法引用遇到重载与泛型方法时,编译器如何根据函数式接口目标签名选择候选方法

A 方法引用按目标函数式接口签名做重载解析与泛型推断,选择签名兼容的最具体候选 ✓ 正确答案
B 方法引用不重载解析
C 重载时总是报错
D 泛型方法引用无法推断
#

5. 模式匹配 instanceof 对泛型类型变量有哪些限制,成功匹配后编译器能保留哪些类型信息

A 泛型擦除使 instanceof 只能匹配可具体化类型(List<?>),无法匹配 List<String>,模式变量保留可具体化类型 ✓ 正确答案
B instanceof 可匹配 List<String>
C instanceof 保留泛型参数
D List<String> 具体化
#

6. 通配符捕获辅助方法如何修改 List<?> 中的元素,为什么直接写入非 null 值无法通过编译

A List<?> 可写任意非 null 值
B 通配符捕获使类型变成动态
C List<?> 可写 null 之外的值
D List<?> 不能写非 null(类型未知),用 <T> 辅助方法捕获通配符为类型变量后可安全操作 ✓ 正确答案
#

7. @Repeatable 注解的容器类型(Container Annotation)合成机制

A 容器注解是可选
B 重复注解只能读取容器
C 容器注解不含数组
D @Repeatable 需定义容器注解(含数组成员),编译器把重复注解合成进容器,getAnnotationsByType 统一读取 ✓ 正确答案
#

8. @SafeVarargs 的合法场景

A 可用于任意方法
B @SafeVarargs 用于 static/final/private 且安全使用 varargs(不暴露数组)的方法,抑制堆污染警告 ✓ 正确答案
C 它用于可变方法
D 它增加堆污染
#

9. @SuppressWarnings("unchecked") 的正确范围

A 应最小化范围(局部声明/方法/类),避免掩盖其他 unchecked 警告,配合注释说明理由 ✓ 正确答案
B 应放整个类
C 范围越大越好
D 它不抑制警告
#

10. AccessibleObject.setAccessible(true) 在 JDK 17 强封装下的合法性边界

A setAccessible 永远合法
B JDK 17 强封装下,setAccessible 需模块 opens 才合法,否则抛异常,反射框架需 --add-opens ✓ 正确答案
C 强封装不影响反射
D setAccessible 不再需要
#

11. Annotation 的合成与继承机制

A 所有注解都继承
B @Inherited 使类注解可被子类继承查询,@Repeatable 合成为容器注解,接口/方法注解不继承 ✓ 正确答案
C 方法注解继承
D 接口注解继承给实现类
#

12. CGLIB 与 ByteBuddy 字节码生成原理对比

A CGLIB 更现代
B ByteBuddy 更老
C ByteBuddy 不用 ASM
D 两者都用 ASM 生成字节码,CGLIB 较老低层,ByteBuddy 现代高层 API 更强大友好,被现代框架采用 ✓ 正确答案
#

13. CGLIB 通过 FastClass 机制绕过反射调用的性能优势与 final 方法/类的限制

A FastClass 用反射调用
B final 类可被 CGLIB 代理
C FastClass 用索引直接调用绕过反射提性能,但 CGLIB 靠继承子类,final 类/方法无法代理 ✓ 正确答案
D FastClass 与性能无关
#

14. Class<? extends X> 的反射 API 限制

A 它提供完整泛型信息
B 它可精确匹配具体类型
C 它提供类型上界约束,但反射 API 受擦除限制,泛型信息可能丢失,newInstance 需无参构造 ✓ 正确答案
D 它不受擦除影响
#

15. Class<?>.getDeclaredFields() 在模块化(JPMS)下跨模块反射访问的限制与 opens 指令

A getDeclaredFields 可访问任何私有字段
B JPMS 强封装下跨模块访问私有成员需模块 opens(--add-opens 或 opens 指令),否则 setAccessible/访问抛异常 ✓ 正确答案
C opens 只影响导出
D 强封装不影响反射
#

16. Class<T> 与 Type 的层次结构

A Type 和 Class 无关
B Type 只有 Class 一个实现
C Class 描述泛型参数
D Type 是根接口,子接口含 Class、ParameterizedType、TypeVariable、WildcardType、GenericArrayType,用于描述泛型类型 ✓ 正确答案
#

17. Class.getGenericSuperclass 与 ParameterizedType 在反射获取泛型实参的细节

A getGenericSuperclass 返回 Class
B 父类带泛型时 getGenericSuperclass 返回 ParameterizedType,getActualTypeArguments 获取泛型实参,是反射取泛型的关键 ✓ 正确答案
C 泛型实参无法获取
D ParameterizedType 不含实参
#

18. JDK 21 模式匹配与记录类结合的解构模式(Deconstruction Pattern)

A record pattern 只能匹配不能解构
B JDK 21 解构模式把记录组件绑定为模式变量,支持 instanceof 与 switch,可嵌套解构 ✓ 正确答案
C 解构模式只用于普通类
D 解构模式不能用于 switch
#

19. JDK 8 元注解(@Repeatable、@Target 扩展)的应用

A @Target 只支持声明
B @Repeatable 只在 JDK 9
C @Repeatable 支持重复注解,@Target 新增 TYPE_USE/TYPE_PARAMETER 支持类型注解与类型参数注解 ✓ 正确答案
D TYPE_USE 只能用于类
#

20. JDK 动态代理(Proxy/InvocationHandler)的实现原理与只能代理接口的原因(生成 $Proxy0 继承 Proxy)

A 生成的 $Proxy0 继承 Proxy 并实现接口,方法转发到 InvocationHandler,因单继承占用 Proxy 只能代理接口 ✓ 正确答案
B 代理类继承目标类
C 可代理任意类
D 代理类不继承 Proxy
#

21. Jackson 或 Spring 中传递 ParameterizedTypeReference 时,如何跨越擦除保留响应体的嵌套泛型

A 它用反射无法保留泛型
B 它不解决擦除
C 它只保留顶层泛型
D 用匿名子类捕获泛型实参(getGenericSuperclass 读 signature),反序列化按完整泛型处理,跨越擦除 ✓ 正确答案
#

22. Java 17 模式匹配 instanceof 后类型擦除的影响

A instanceof 可匹配 List<String>
B 擦除不影响模式匹配
C 擦除使 instanceof 只能匹配可具体化类型,List<String> 非法,List<?> 可匹配且模式变量保留可具体化类型 ✓ 正确答案
D instanceof 保留泛型参数
#

23. Java 17+ 反射模块化(强封装)与 --add-opens

A JDK 17 默认不封装
B JDK 17 强封装内部 API,反射框架需 --add-opens 开放特定包,最小化开放以控制风险 ✓ 正确答案
C 强封装不影响反射
D --add-opens 无风险
#

24. Java 25 ScopedValue(JEP 506)与反射访问的关系

A ScopedValue 是线程本地数据传递机制,常规用 try-with-resources 绑定,反射访问需遵循模块封装,二者无直接绑定 ✓ 正确答案
B ScopedValue 依赖反射实现
C ScopedValue 只能反射访问
D ScopedValue 与 ThreadLocal 完全相同
#

25. Java 8 Lambda 与目标类型推断

A Lambda 有自含类型
B Lambda 类型总是 Runnable
C Lambda 类型由目标函数式接口上下文推断,赋值/参数/返回等上下文决定其类型 ✓ 正确答案
D Lambda 无需上下文
#

26. Java 泛型类型擦除的实现机制与运行时影响

A 运行时保留泛型参数
B 编译时把泛型参数替换为上界并插入强转,运行时无泛型信息,影响 instanceof/数组/反射 ✓ 正确答案
C instanceof 可检查泛型参数
D 可创建泛型数组
#

27. List<String> 与 List<Integer> 在运行时的相等性

A 运行时 Class 不同
B 泛型参数运行时可见
C instanceof 可区分
D 擦除使两者运行时 Class 相同,无法区分泛型参数,内容相等性由元素决定 ✓ 正确答案
#

28. Lookup 与 MethodHandle 的查找语义

A findVirtual 用于静态方法
B Lookup 无访问控制
C Lookup 封装调用者的访问上下文,用 findVirtual/findStatic 等查找方法生成 MethodHandle,访问受模块/类约束 ✓ 正确答案
D MethodHandle 只能通过反射获取
#

29. MethodHandle 与 VarHandle 的能力边界

A MethodHandle 用于字段原子操作
B MethodHandle 面向方法调用(可内联、绑定),VarHandle 面向字段/数组原子访问,二者互补 ✓ 正确答案
C VarHandle 用于方法调用
D 两者能力相同
#

30. MethodHandle(JDK 7+)与 LambdaMetafactory 在高性能反射调用中的取舍

A 两者都比反射慢
B 反射最快
C MethodHandle 不用内联
D MethodHandle 直接调用方法句柄可内联,LambdaMetafactory 生成函数式接口实例并内联,都比反射快 ✓ 正确答案
#

31. ParameterizedType、WildcardType、TypeVariable 与 GenericArrayType 分别描述哪些反射类型结构

A ParameterizedType 描述通配符
B TypeVariable 描述参数化类型
C GenericArrayType 描述普通数组
D ParameterizedType 描述参数化类型、WildcardType 通配符、TypeVariable 类型变量、GenericArrayType 泛型数组 ✓ 正确答案
#

32. Recursive Type Bound(<T extends Comparable<T>>)的应用

A <T extends Comparable<T>> 约束 T 必须可比较自身,用于泛型排序/比较算法 ✓ 正确答案
B 递归上界与比较无关,只用于数字运算
C Comparable<? super T> 总是比 Comparable<T> 更不灵活
D 递归上界只用于数字,不能用于对象类型
#

33. ServiceLoader 的懒加载(lazy iteration)与 @AutoService 注解自动生成 META-INF/services 配置

A ServiceLoader 加载时立即实例化全部
B ServiceLoader 不懒加载
C @AutoService 手动维护配置
D ServiceLoader 迭代时按需实例化(懒加载),@AutoService 编译期自动生成 META-INF/services 配置 ✓ 正确答案
#

34. StackWalker 替代 getStackTrace 的取舍

A getStackTrace 更高效
B StackWalker 只能取全部帧
C StackWalker 按需遍历栈帧、只取所需信息,比 getStackTrace 创建完整数组更高效 ✓ 正确答案
D 两者开销相同
#

35. TypeToken(Gson)解决泛型擦除的工程方案

A TypeToken 无法保留泛型
B TypeToken 用匿名子类捕获泛型实参,Gson 反序列化按完整泛型处理,解决擦除 ✓ 正确答案
C TypeToken 用运行时动态类型
D TypeToken 只保顶层
#

36. sun.misc.Unsafe 的禁用与替代

A 无替代方案
B Unsafe 是稳定公开 API
C Unsafe 永不限制
D Unsafe 是危险内部 API,受强封装限制,替代用 VarHandle(原子)、MemorySegment(内存)、LockSupport(park) ✓ 正确答案
#

37. super 通配符的写入限制与读取灵活性

A 写入受限、读取灵活
B 不能写入
C 只能读具体类型
D ? super T 可写 T 及子类,读取只能 Object(写入灵活、读取受限),符合"消费者 super" ✓ 正确答案
#

38. 两个泛型重载经类型擦除后签名相同为何无法共存,修改返回类型能否解决这种冲突

A 擦除后参数签名相同冲突,返回类型不参与签名且 Java 不允许仅返回类型不同的重载,需改方法名/参数 ✓ 正确答案
B 返回类型参与签名
C 改返回类型可解决
D 擦除冲突可共存
#

39. 交叉类型上界如何同时约束父类和多个接口,类型变量声明时为什么父类必须排在最前

A 类上界可放任意位置
B 可有多个类上界
C 接口只能一个
D 交叉类型上界用 & 同时约束父类与多个接口,父类必须排最前(单继承一个类上界,接口可多个) ✓ 正确答案
#

40. 原始类型(Raw Type)与泛型类型的兼容性陷阱

A raw type 与泛型混用产生 unchecked 警告与潜在运行时 CCE,应始终参数化并迁移遗留代码 ✓ 正确答案
B raw type 与泛型混用类型安全
C raw type 无警告
D 混用不会 CCE
#

41. 反射获取 Class 对象的三种途径与性能影响

A .class 最慢
B getClass 触发初始化
C forName 最快
D .class 编译期常量最轻、getClass() 运行时快速、forName 需字符串加载可能初始化最慢 ✓ 正确答案
#

42. 反射调用方法与构造器的性能开销与 setAccessible

A 反射与直接调用一样快
B 反射有查找/装箱/访问检查开销且难内联,setAccessible 跳过检查提速,热路径用 MethodHandle 或缓存 ✓ 正确答案
C setAccessible 使反射与直接调用相同
D 反射可被 JIT 内联
#

43. 哪些类型属于可具体化类型,为什么可以检查 instanceof List<?> 却不能检查 List<String>

A 可具体化类型含 List<?>/原始类型/非泛型,List<String> 不可具体化,instanceof 只能检查可具体化类型 ✓ 正确答案
B instanceof 可检查 List<String>
C 类型变量可具体化
D List<String> 可具体化
#

44. 泛型 record 的规范构造器如何校验组件不变式,静态成员为何不能引用 record 的类型参数

A 构造器可校验组件不变式,静态成员属于类级不能引用实例级类型参数 T ✓ 正确答案
B 静态成员可引用类型参数
C 类型参数是类级
D 静态成员可用 T
#

45. 泛型与数组协变的兼容性问题

A 泛型也是协变
B 数组协变(运行时检查)但泛型不变,泛型数组因擦除+协变不安全被禁止,用集合替代 ✓ 正确答案
C 泛型数组合法
D List<String> 是 List<Object> 子类型
#

46. 泛型接口实现时的桥接方法(Bridge Method)

A 桥接方法是手写的
B 桥接方法无意义
C 桥接方法用于类型擦除前的签名
D 桥接方法是编译器在擦除后生成的合成方法,使接口/父类的 Object 方法正确分派到具体类型方法,保持多态 ✓ 正确答案
#

47. 泛型数组为何不能直接创建(new T[])

A new T[] 合法
B 擦除后无法确定元素类型且数组协变不安全,new T[] 被禁止,用 List<T> 或强转 Object[] 替代 ✓ 正确答案
C 泛型数组与普通数组相同
D new T[] 类型安全
#

48. 泛型方法、泛型类与类型推断的边界

A 泛型类无需指定类型
B 泛型方法需实例化指定类型
C 泛型方法无推断
D 泛型方法调用时推断、泛型类实例化指定,类型推断受上下文约束,复杂场景需显式类型参数 ✓ 正确答案
#

49. 泛型类为什么不能直接或间接继承 Throwable,catch 子句又为何不能捕获类型变量

A 泛型类可继承 Throwable
B 泛型擦除后无法精确匹配异常类型,泛型类不能继承 Throwable,catch 需具体化类型不能捕获类型变量 ✓ 正确答案
C catch 可捕获类型变量
D 异常类可泛型
#

50. 泛型类的静态成员为何不能使用类类型参数,其限制的根因与规避方式是什么?

A 类型参数是实例级,静态成员类级无 T 故不能用,规避:静态方法用方法级类型参数 ✓ 正确答案
B 类型参数是类级
C 静态成员可使用类型参数
D 静态字段可用 T
#

51. 注解处理器(APT/KAPT/KSP)的发展

A KSP 比 KAPT 慢
B APT 只在运行时
C Java 用标准 APT,Kotlin 用 KAPT(桥接 Java 处理器)或 KSP(直接符号处理,更快) ✓ 正确答案
D KAPT 直接处理 Kotlin 符号
#

52. 注解的保留策略(SOURCE/CLASS/RUNTIME)与读取机制

A CLASS 运行时可反射
B SOURCE 保留到运行时
C RUNTIME 可反射读取,CLASS 保留在字节码(工具/处理器读取),SOURCE 仅源码,按读取需求选择 ✓ 正确答案
D 所有注解都运行时读取
#

53. 类型推断在链式调用与方法引用(Method Reference)

A 链式调用无推断
B 方法引用无需预测
C 链式调用与方法引用都靠目标类型推断,受赋值/参数/返回上下文约束,复杂场景需显式类型 ✓ 正确答案
D 推断总是自动成功
#

54. 类型擦除后如何通过反射获取泛型信息

A 运行时完全无泛型可获取
B class 文件 signature 属性保留泛型签名,反射 getGenericXxx 读取并解析为 Type(ParameterizedType 等) ✓ 正确答案
C getGenericType 返回 Class
D 泛型信息无法反射
#

55. 类型擦除(Type Erasure)在桥接方法(Bridge Method)

A 桥接方法由运行期生成
B 桥接方法用于擦除前
C 擦除后签名变化,桥接方法桥接 Object 签名到具体类型方法,保持多态分派正确 ✓ 正确答案
D 桥接方法不影响多态
#

56. 设计只读生产者和可写消费者 API 时,如何应用 PECS 又避免返回类型被通配符污染

A 返回类型应通配符
B 返回类型用通配符更灵活
C 通配符只用于返回
D PECS 用通配符修饰参数(生产 extends、消费 super),返回类型避免通配符污染(用具体类型或辅助方法) ✓ 正确答案
#

57. 通配符 ?、? extends T、? super T 的 PECS 原则

A ? extends 可写
B PECS:生产者用 ? extends T(可读)、消费者用 ? super T(可写),无界 ? 任意类型只读 ✓ 正确答案
C ? super 可读具体类型
D ? extends 可写任意值
#

58. 链式泛型方法调用发生目标类型推断时,赋值上下文、参数上下文和返回值如何共同约束类型

A 推断只由赋值上下文决定
B 赋值、参数、返回上下文联合约束推断,Lambda 是 poly expression 受目标类型决定,冲突时显式指定 ✓ 正确答案
C 推断总是成功
D 参数上下文无关
#

59. JDK 25 中 JSpecify(null-safety 注解)

A JSpecify 是 JDK 内建语法
B JSpecify 无工具支持
C JSpecify 只用于运行时
D JSpecify 提供标准空值注解(@Nullable/@NonNull),供静态分析工具进行空值安全分析 ✓ 正确答案
#

60. JDK 25 原始类型与未检查警告的演进

A 警告可忽略
B JDK 25 移除 raw type
C raw type 无警告
D JDK 25 强化 raw type 的 unchecked 警告提示,推动迁移到参数化类型,但保留旧代码兼容 ✓ 正确答案
#

61. JEP 483(AOT Class Loading & Linking)

A JEP 483 是运行时优化
B JEP 483 只影响编译
C JEP 483 提前进行类加载与链接(AOT)减少启动开销,配合 CDS 优化启动性能 ✓ 正确答案
D JEP 483 与启动无关
#

62. JEP 484 与 ASM/Javassist 的关系(标准 vs 第三方)

A JEP 484 替代 ASM
B ASM 是 JDK 标准
C JEP 484 是 JDK 标准类文件 API,ASM/Javassist 是第三方库,JEP 484 提供标准选项减少 JDK 对第三方依赖 ✓ 正确答案
D JEP 484 与字节码无关
#

63. JEP 484 在框架(Spring/Hibernate)二次开发中的潜在应用

A 框架一定用 ASM
B JEP 484 只能 JDK 内部用
C 框架可用 JEP 484 生成/解析字节码(代理/增强),减少对第三方 ASM 依赖,获得标准稳定 API ✓ 正确答案
D 框架无法用 JEP 484
#

64. Java 24+ Class-File API(JEP 484)

A 它是运行时 API
B JEP 484 是 JDK 标准 Class-File API,类型化解析/生成 class 文件,Java 24 预览特性 ✓ 正确答案
C 它只生成不解析
D 它是第三方库
#

65. Java SPI(ServiceLoader)机制的工作原理及其与 Spring SPI(SpringFactoriesLoader)的差异

A 两者用相同配置文件
B Spring SPI 用 services 文件
C ServiceLoader 用 META-INF/services/<接口>,SpringFactoriesLoader 用 META-INF/spring.factories 多条目,都是 SPI 扩展机制 ✓ 正确答案
D ServiceLoader 用 spring.factories
#

66. MethodHandle.Lookup.defineClass 在 JDK 25 的可访问性

A 生成的类可访问任意类
B 生成类无访问权限
C 可跨模块随意定义
D 生成的类继承 Lookup 的访问上下文(可访问 Lookup 类成员),受模块/包边界限制 ✓ 正确答案