Kotlin 2.5 引入实验性 companion 块与扩展:伴生机制补强跨平台互操作

JetBrains 在 Kotlin 官方博客介绍:自 Kotlin 2.5.0 起,可用实验性的 companion 块(companion block)与 companion 扩展(companion extension),在保留 companion object 的同时,补一类更接近静态成员的写法,并改善多平台互操作。[1]

companion 块长什么样

许多语言都有「属于类型本身、不属于某个实例」的成员:常量、工厂、工具方法。Kotlin 以往主要靠 companion object。2.5 起也可以写成 companion 块,语法接近,但编译策略不同:[1]

data class Vector(val x: Double, val y: Double) {
  companion {
    val ZERO = Vector(0.0, 0.0)
  }
}

还可以用 companion 扩展,给自己并不掌控的类型追加「类级」成员,例如:

companion fun Vector.unit(angle: Double) = Vector(cos(angle), sin(angle))

官方说明,设计目标之一是突破 companion object 的限制:扩展可作用在任意类或接口上——不论是否由你定义、是否来自 Java、原先有没有 companion object。编译上更接近其他平台的静态成员;在 JVM 上 companion 块会编译为静态成员。对 Kotlin Multiplatform,可以声明 expected companion 块成员,再用带静态成员的 Java 类做 actual。[1]

怎么启用、和 object 什么关系

companion 块与扩展自 Kotlin 2.5.0-Beta1 起以实验特性提供,需额外编译器开关:-Xcompanion-blocks 仅开块;-Xcompanion-blocks-and-extensions 同时开扩展。启用扩展会使编译器产出预发布二进制,在特性稳定前,依赖方可能无法正常消费这类库;仅暴露 companion 块不受同一限制,但消费方仍需打开 companion blocks 特性。[1]

博客也回答「还要不要 companion object」:多数原先放进 companion object 的用法,新代码可以优先考虑 companion 块;但若伴生需要实现某个接口,仍只能用 companion object,因为它会编译成完整类。官方明确:companion object 仍是语言组成部分,支持有保障,不必强制迁移;若迁移,多数情况去掉 object 关键字即可,项目及依赖方需重新编译,生态工具链也还在跟进。[1]

更细的语言设计见对应 KEEP 提案;是否在业务项目启用,按实验特性风险自行评估。[1]

来源

[1] The Companions to Come,JetBrains Kotlin Blog,Alejandro Serrano Mena,2026年10月。查询日期:2026-10-27。

#Kotlin #Kotlin2.5 #companion #JetBrains #多平台

排序方式 :

成为第一条评论!

Nobody's responded to this post yet. Add your thoughts and get the conversation going.