前言
2026 年 4 月 22 日,JetBrains 发布 Kotlin 2.4.0-Beta2(EAP)。
相对 3 月底的 Beta1,这一版更像 “把 Beta1 画过的路线图往可 ship 状态再推一步”:语言里多了几条值得单独开编译开关试的能力,Native / Wasm / JS 各自补了能直接改善工程体验的一块,构建侧把 Gradle 9.4.1 和 Maven JVM 对齐写进了发布说明。
官方入口:What's new in Kotlin 2.4.0-Beta2。
稳定圈继续扩大,实验圈开始热闹
已经稳定、默认就能用的包括:
-
•
context parameters(context arguments与可调用引用仍不在稳定范围) -
• 注解 use-site target 相关:
@allmeta-target、以及新的默认推断规则 -
•
explicit backing fields(显式后备字段语法线)
新实验能力里,最显眼的是 集合字面量:用方括号直接构造集合,类型足够时由编译器推断。
// 需要打开 -Xcollection-literals
val shapes: MutableList<String> = ["triangle", "square", "circle"]
val fruit = ["apple", "banana", "cherry"] // 推断为 List
嵌套字面量会落到你自定义类型的 operator fun of 上,矩阵一类 DSL 会好写很多。开关:
kotlin {
compilerOptions {
freeCompilerArgs.add("-Xcollection-literals")
}
}
另一条实验线是 编译期常量增强:无符号运算、字符串 lowercase / trim 一类 stdlib、枚举 .name、KCallable 等,在编译期求值更一致;官方用 IntrinsicConstEvaluation 标出“保证在编译期算”的函数集合,后续还会继续补标。开关:
kotlin {
compilerOptions {
freeCompilerArgs.add("-XXLanguage:+IntrinsicConstEvaluation")
}
}
显式 context 实参继续是实验:用来消解“只靠 context 区分重载”时的二义性,调用点写 sendNotification(emailSender = ...) 这种名字即可。编译开关仍是 -Xexplicit-context-arguments。
UUID与排序
kotlin.uuid.Uuid 在 common 标准库 转正稳定;V4 / V7 生成 仍标实验、需要 opt-in。
isSorted() / isSortedBy() 等扩展还在,语义是遇到第一对逆序就停,适合大列表做前置断言而不是先 sorted() 再比。
JVM 上 UInt.toBigInteger() / ULong.toBigInteger() 继续提供,省掉字符串绕路。
Kotlin/JVM
编译器可以生成 Java 26 级别字节码。
更偏生态的一条:annotations in metadata 默认开启。注解跟着 Kotlin metadata 走之后,处理器和元数据工具不必再靠反射去“猜”注解语义,对框架和静态分析是实打实的减负。
Kotlin/Native
Gradle 里声明 Swift Package 依赖的链路在 Beta1 已铺好,Beta2 继续强调 可从 CocoaPods 迁到 SPM 的官方迁移文档。
新增强点是 kotlinx.coroutines 的 Flow 可导出到 Swift,侧是 AsyncSequence,类型信息会保留,默认开启。
// Kotlin
fun flowOfStrings(): Flow<String> = flowOf("hello", "any", "world")
var actual: [String] = []
for try await element in flowOfStrings().asAsyncSequence() {
actual.append(element)
}
GC 侧:并发标记(CMS)改为默认。标记阶段可以和应用线程并发跑,停顿更短;Compose Multiplatform 在 iOS 上的基准里官方也拿来当过例子。若线上遇到回归,可在 gradle.properties 退回旧策略:
kotlin.native.binary.gc=pmcs
Kotlin/Wasm
增量编译在 Wasm 目标上 稳定且默认启用;若踩雷可在 gradle.properties 关掉:
kotlin.incremental.wasm=false
WebAssembly Component Model 仍是实验目标:把 Wasm 从“浏览器里跑一段二进制”往 可组合、跨语言的组件系统推,官方示例仓库走 wasi:http 路线,偏 FaaS / serverless 场景。
Kotlin/JS
inline value class 可以配合 @JsExport 导出成 TypeScript 侧的普通 class,带 init 校验的邮箱这类封装会自然很多。
js() 内联字符串生成 JS 时,现在完整支持 ES2015:箭头函数、class、模板字符串、展开运算符、const/let、generator 等,和第三方库的互操作会少一层“为了兼容老 JS 语法而绕路”。
Gradle 与 Maven
Gradle 7.6.3 ~ 9.4.1 官方声明全兼容;更新 Gradle 仍可能看到弃用警告,这是常态。
Maven:kotlin-maven-plugin 会 自动把 JVM target 与 Java 编译器版本对齐,减少 “Kotlin 打出 11、Java 插件以为 17” 这种隐性不一致。开启相关选项后,构建日志里会看到类似 Using jvmTarget=17 (derived from maven.compiler.release=17) 的提示。
编译器 .klib
Kotlin/Native、JS、Wasm 在生成 .klib 时,同模块内的 inline 函数默认先做内联,跨模块仍留到后续平台二进制阶段;行为和 JVM “编译期固定 inline 语义”更接近。
出问题可以 -Xklib-ir-inliner=disabled 关掉;想提前试跨模块全内联用 -Xklib-ir-inliner=full(仍属前瞻开关)。
最后
2.4.0-Beta2 适合已经在跟 2.4 的团队 顺势前移一格:语言实验用独立模块试,KMP iOS 重点盯 Flow 导出与 GC,Wasm 盯 增量默认,JS 库作者看 value class 导出。
业务主干仍建议 旁路分支 + CI 矩阵,不要全员直接切 EAP。
#Kotlin #KotlinMultiplatform #Android开发 #Gradle #WebAssembly