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

Kotlin中如何将构造函数传递给函数式接口?

用构造函数引用实现Kotlin函数式接口的正确方式

你的代码里的问题很明确:Kotlin的SAM(单抽象方法)自动转换默认只认lambda表达式,直接用构造函数引用::Job时,编译器不会自动把它转换成JobCompiler接口实例——因为::JobTest.Job的类型是KFunction2<String, Long, JobTest.Job>,和JobCompiler不是一回事。

下面给两种可行的修改方案:

方案1:显式调用函数式接口构造器

这是最直观清晰的写法,直接把构造函数引用传给JobCompiler的创建方法:

fun main() {
  val compiler: JobTest.JobCompiler = JobTest.JobCompiler(::JobTest.Job)
  val job = compiler.compile("Tom", 100)

  println("Name: ${job.name}, Id: ${job.id}") // 输出 Name: Tom, Id: 100
}

函数式接口的构造器会自动把传入的构造函数引用适配到compile方法的签名上,完美匹配需求。

方案2:类型强制转换

如果嫌显式调用构造器麻烦,也可以用as把构造函数引用转成目标接口类型:

fun main() {
  val compiler: JobTest.JobCompiler = ::JobTest.Job as JobTest.JobCompiler
  val job = compiler.compile("Tom", 100)

  println("Name: ${job.name}, Id: ${job.id}")
}

不过这种方式可读性差一点,而且如果方法签名不匹配,运行时会抛异常,更推荐用方案1。

额外说明

为啥lambda能直接赋值?因为Kotlin对lambda做了特殊处理,只要lambda的参数和返回值匹配函数式接口的抽象方法,就会自动转成接口实例。但函数引用(包括构造函数引用)属于KFunction类型,编译器不会自动做这个转换,必须显式指定。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 06:15:06