You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否从Groovy调用带具名参数的Kotlin函数(含copy方法)?

在Groovy中以具名参数方式调用Kotlin函数的实践探索

背景

基于Kotlin代码库,使用Spock/Groovy编写测试场景下,若能通过参数名调用带默认参数的Kotlin函数会大幅提升测试代码的便捷性,尤其适合实体类的测试构建器场景。

给定的Kotlin代码

data class User(
  val id: Id,
  val name: String,
  val emailAddress: String,
)

fun buildUser(
  id: Id = randomId(),
  name: String = randomName(),
  emailAddress: String = randomEmailAddress(),
): User

期望的Groovy调用方式

User user = buildUser(
  name: 'My name'
)

实现方向与扩展需求

该需求具备可行性,可通过两种方向实现:

  • Kotlin侧:借助编译器插件重载buildUser函数,新增接收Map参数的版本
  • Groovy侧:使用AST转换实现语法适配

目前是否已有成熟的相关实践方案?

此外,若该实现能延伸支持Kotlin data class的copy方法调用会更实用,例如:

User user = buildUser()
User userWithDifferentEmailAddress = user.copy(emailAddress: 'me@example.com')

理想状态下希望IntelliJ IDEA能同步支持参数重命名、跳转等IDE特性,但这一要求可能存在较高的实现门槛。

反编译代码佐证(补充)

查看Kotlin代码反编译后的Java实现,生成了如下带默认参数处理的方法:

public static User buildUser$default(Id var0, String var1, String var2, int var3, Object var4) {
  // uses var3 as a flag to indicate which fields were provided by the caller
}

public static User copy$default(User var0, Id var1, String var2, String var3, int var4, Object var5) {
  // uses var4 as a flag to indicate which fields were provided by the caller
}

从反编译结果来看,完全可以通过Groovy层面的适配实现目标调用方式。


内容的提问来源于stack exchange,提问作者Robert Elliot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 06:31:21