前面几节讲的是"怎么用",这一节讲"为什么会出事"。Kotlin 编译期陷阱的特点是——代码能编译、测试也可能过,但上到特定环境(混淆、序列化、多进程、泛型擦除)才暴露。面试里问"你踩过哪些 Kotlin 的坑",答不出机制层的解释,就只是背诵。
先把结论放在前面:Kotlin 的编译期陷阱集中在五个来源。①data class 与混淆:自动生成的方法被 R8 改名/移除,JSON 反射失配。②空安全的"编译期承诺"在跨语言处失效:注解不强制。③泛型擦除:is检查与reified的边界。④伴生对象与静态初始化的顺序:类加载时机与@JvmStatic的位置。⑤内联类/value class 遇反射与泛型:上一节讲过装箱,本节补充它与混淆、序列化的交互。掌握这五条,能解释绝大多数线上"只在 release 出问题"的 Kotlin 怪象。
机制背后的执行路径
第一条是 data class 与混淆。data class靠编译器生成componentN()、copy()、equals()/hashCode()、toString()。这些方法没有在源码里出现,R8 看不到调用点,就会认为它们可删或可改。于是: