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
相关产品推荐
相关产品推荐

