Kotlin 与 JVM 多语言生态

共 19 题
#

1. Kotlin 与 Java 的互操作边界,空安全、扩展函数、协程与 Java 代码的桥接注意点如何?

A Kotlin 与 Java 完全无缝,无任何边界
B suspend 函数在 Java 中可直接调用
C 扩展函数可直接在 Java 中调用
D Java 类型在 Kotlin 中是平台类型、扩展函数编译为静态方法、suspend 需桥接,需注意边界 ✓ 正确答案
#

2. Kotlin 挂起函数(suspend)的编译产物,Continuation 与状态机如何实现非阻塞,与虚拟线程的定位差异如何?

A 两者机制完全相同
B suspend 通过状态机 + Continuation 实现非阻塞,虚拟线程通过阻塞时让渡载体线程,机制不同 ✓ 正确答案
C suspend 是阻塞式模型
D 虚拟线程是语言层概念
#

3. Kotlin 协程的调度器(Dispatchers.IO/Default/Unconfined)与线程池的关系,协程取消与结构化并发的机制?

A Unconfined 使用固定线程池
B 协程取消是非协作式的,无需检查
C 协程取消不会传播到子协程
D Dispatchers.IO 与 Default 共享底层线程池,Default 适合 CPU 密集 ✓ 正确答案
#

4. 内联值类(value class)与 @JvmInline 的装箱边界及性能取舍

A 值类在泛型、数组等场景也总是内联免装箱
B @JvmInline 与值类无关
C 值类大多数场景内联免分配,但作为泛型参数、数组、可空时退化为装箱 ✓ 正确答案
D 值类总是会分配对象
#

5. Kotlin 协程在 Spring WebFlux 项目中的使用与性能对比?

A WebFlux 不支持 suspend 协程
B 协程是阻塞式的,性能远低于响应式
C Spring 支持 suspend 控制器,协程与响应式底层都非阻塞,性能相当但协程更易读 ✓ 正确答案
D 协程无法获得高并发
#

6. Groovy/Scala/Kotlin 在 JVM 服务端生态中的定位,何时值得引入多语言?

A Scala 适合脚本与 DSL 场景
B Kotlin 是服务端 Java 的主要替代,Groovy 适合脚本/DSL,Scala 适合大数据/函数式 ✓ 正确答案
C Groovy 性能强于 Kotlin
D 引入多语言无需考虑团队成本
#

7. Kotlin 与 Java 互操作的注意点,空安全注解、平台类型、默认参数与 `@JvmOverloads`、伴生对象静态化如何?

A 需用 @JvmOverloads 生成重载供 Java 调用,@JvmStatic/@JvmField 静态化伴生对象成员 ✓ 正确答案
B 默认参数在 Java 侧可直接使用
C 伴生对象成员默认就是静态的
D 空安全注解对互操作无影响
#

8. Flow 的背压与冷/热流语义,与 RxJava/Reactor 在 JVM 侧的选型差异?

A Flow 是热流,不支持背压
B Flow 是 Kotlin 原生、支持背压与冷/热流,选型看语言集成与生态匹配 ✓ 正确答案
C Flow 无法与协程集成
D Reactor 是 Kotlin 原生库
#

9. 扩展函数、密封类与 `when` 穷尽性如何改善领域建模,与 Java 的等价写法对比?

A 密封类与 when 无法穷尽性检查
B 扩展函数会破坏封装
C 扩展函数保持类纯净,密封类 + when 提供编译期穷尽性检查,优于 Java 的 instanceof 链 ✓ 正确答案
D when 必须手写 default 分支
#

10. Kotlin 协程与 Java 虚拟线程的互操作,suspend 函数如何桥接 Java?

A suspend 函数在 Java 中可直接调用
B 互操作只能使用 runBlocking
C 协程无法在虚拟线程上运行
D suspend 编译为 Continuation 方法,Java 侧需用 CompletableFuture/回调等桥接 ✓ 正确答案
#

11. kotlinx.serialization 与 Jackson 的对比(Kotlin 反射、无参构造问题)

A Jackson 完全支持 Kotlin 特性,无需额外适配
B kotlinx.serialization 通过编译器生成序列化码,免反射;Jackson 需 Kotlin 反射与无参构造适配 ✓ 正确答案
C kotlinx.serialization 依赖 kotlin-reflect
D 两者在 Kotlin 支持上完全等价
#

12. data class 的 copy/equals 与组件函数(componentN)的解构

A equals 包含类体内所有属性
B data class 自动生成 equals/hashCode/copy/componentN,且基于主构造属性 ✓ 正确答案
C copy 会修改原对象
D componentN 解构顺序与属性声明无关
#

13. Kotlin Multiplatform 在后端与客户端共享代码的适用边界?

A KMP 可共享所有代码,包括 UI 与平台 API
B KMP 无法共享 data class
C KMP 适合共享纯 Kotlin 业务逻辑,平台差异需 expect/actual 分别实现,构建复杂 ✓ 正确答案
D KMP 只支持 JVM 平台
#

14. Kotlin 集合只读接口(List/readOnly)与 Java 可变集合互操作时的防御性拷贝边界?

A 只读接口底层可能可变,与 Java 互操作时需防御性拷贝隔离可变性 ✓ 正确答案
B Kotlin 只读接口就是不可变集合
C Kotlin 集合无法与 Java 互操作
D 只读接口禁止底层可变
#

15. Kotlin 空安全与 Java 平台类型的边界,@Nullable 注解的互认机制如何?

A 未标注的 Java 类型是平台类型,需小心;@Nullable 注解互认可恢复编译期检查 ✓ 正确答案
B Java 类型在 Kotlin 中总是不可空
C 平台类型有编译期空检查
D 空注解不影响 Kotlin 识别
#

16. Kotlin 的协程调度器与线程池映射,Dispatchers.IO 如何实现?

A Dispatchers.IO 与 Default 完全独立,无共享
B IO 调度器无并发限制
C IO 任务会阻塞 CPU 调度线程
D Dispatchers.IO 基于共享线程池并限制并发,用于阻塞 IO,与 Default 共享底层线程 ✓ 正确答案
#

17. Kotlin 与 Java 混编的构建,Gradle 的 kotlin-jvm 插件的源集管理如何?

A kotlin-jvm 插件自动处理 src/main/kotlin 与 java 源集并支持交叉编译 ✓ 正确答案
B kotlin-jvm 插件只编译 Kotlin 源集,忽略 Java
C 混编时 Kotlin 不能引用 Java 代码
D 混编无需配置 jvmTarget
#

18. Kotlin 协程取消与 Java 阻塞调用的互操作,runInterruptible 的作用如何?

A runInterruptible 让 blocking 调用无法被取消
B runInterruptible 与取消机制无关
C runInterruptible 在协程取消时中断底层线程,使 Java 阻塞调用可被取消 ✓ 正确答案
D 所有 Java 阻塞调用都能被 runInterruptible 中断
#

19. Kotlin 的 @JvmStatic/@JvmField 与伴生对象的 Java 互操作细节

A 伴生对象成员默认就是静态的
B Java 无法访问伴生对象成员
C @JvmField 生成 getter/setter
D @JvmStatic 生成静态方法、@JvmField 生成静态字段,未标注时 Java 需用 Companion 访问 ✓ 正确答案