前面几节在 Kotlin 语法与协程内部,这一节切到工程里天天要面对的另一面:Kotlin 与 Java 混编的边界规则。任何真实项目都不可能纯 Kotlin——历史代码是 Java 的,第三方 SDK 是 Java 字节码的,新代码是 Kotlin 的。于是就有一堆"看起来能编译,跑起来出问题"的坑:默认参数在 Java 侧消失、object的方法怎么调、SAM 转换什么时候失效、val生成的 getter 命名规则、internal为什么对 Java 可见。面试里这题被答全的比例很低,因为它考的是"真的写过混合工程"。先把结论放在前面:Kotlin 与 Java 的互操作有四条底层规则贯穿所有细节。①空安全在 Java 侧失效:Kotlin 的String(非空)在 Java 签名里就是String,@NotNull/@Nullable只是注解,编译期不强制。②默认参数值不参与 Java 重载:Kotlin 只生成一个带DefaultConstructorMarker的合成方法,Java 调不到默认值。③属性与静态成员访问方式不同:Kotlin 属性编译成getXxx(),对象成员编译到INSTANCE或伴生对象上。④顶层声明被编译到文件类:命名冲突靠@J